Я бы использовал это:
select t.*
from test as t
join
(select max(rev) as rev
from test
group by id) as o
on o.rev = t.rev
Подзапрос SELECT не слишком эффективен, но в предложении JOIN кажется полезным. Я не эксперт в оптимизации запросов, но я пробовал в MySQL, PostgreSQL, FireBird, и он работает очень хорошо.
Вы можете использовать эту схему в нескольких соединениях и с предложением WHERE. Это мой рабочий пример (решение идентично вашей задаче с таблицей «твердое»):
select *
from platnosci as p
join firmy as f
on p.id_rel_firmy = f.id_rel
join (select max(id_obj) as id_obj
from firmy
group by id_rel) as o
on o.id_obj = f.id_obj and p.od > '2014-03-01'
Его спрашивают на таблицах с подростками таких записей записей, и он занимает менее 0,01 секунды на самом деле не слишком сильная машина.
Я бы не использовал пункт IN (как упоминается выше). IN предоставляется для использования с короткими списками констант, а не как фильтр запросов, построенный на подзапросе. Это связано с тем, что подзапрос в IN выполняется для каждой отсканированной записи, которая может сделать запрос очень медленным.
org.apache.jasper.JasperException: Абсолютный uri: http://java.sun.com/jstl/core не может быть разрешен в файле web.xml или jar развернутый с этим приложением
blockquote>Этот URI для JSTL 1.0, но вы на самом деле используете JSTL 1.2, который использует URI с дополнительным
/jsp
путем (поскольку JSTL, который изобрел EL-выражения, поскольку версия 1.1 интегрирована как часть JSP для совместного использования / повторного использования EL-логики в простом JSP).Итак, исправьте URI taglib соответственно:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Дальше POM также определяет реализацию Apache JSTL 1.1 через
taglibs:standard
. Это необязательно и даже опасно, если у вас уже есть JSTL 1.2 API + impl, связанный черезjavax.servlet:jstl
, потому что 1.1 и 1.2, очевидно, конфликтуют друг с другом. Только одна из следующих зависимостей JSTL 1.2 должна сделать это, чтобы JSTL был установлен в вашем веб-приложении, ориентированном на Tomcat (не устанавливайте<scope>
наprovided
, поскольку Tomcat на самом деле не предоставляет его в поле!):<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
Пользователи, не являющиеся членами Maven, могут добиться того же, отбросив единственный файл jstl-1.2.jar в папке
/WEB-INF/lib
проекта веб-приложения (не отбрасывайте standard.jar или любые свободные .tld-файлы там!).Если вы на самом деле используете обычный Java EE-сервер, такой как WildFly, Payara и т. д. вместо barebones servletcontainer, таких как Tomcat, Jetty и т. д. то вам не нужно явно устанавливать JSTL. Обычные серверы Java EE уже предоставляют JSTL из коробки. Другими словами, вам не нужно добавлять JSTL в
pom.xml
и не удалять файлы JAR / TLD в webapp. Исключительно достаточноprovided
координаты Java EE:<dependency> <groupId>javax</groupId> <artifactId>javaee-api</artifactId> <version><!-- 8.0, 7.0, etc depending on your server --></version> <scope>provided</scope> </dependency>
Далее вы также должны убедиться, что ваш
web.xml
объявлен как совместимый не менее Servlet 2.4 и, следовательно, не как Сервл 2.3 или старше. В противном случае EL-выражения внутри тегов JSTL, в свою очередь, не сработают. Выберите самую высокую версию, соответствующую вашему целевому контейнеру, и убедитесь, что у вас нет<!DOCTYPE>
в любом месте вашегоweb.xml
. Вот пример совместимости с сервлетами 4.0 (Tomcat 9):<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!-- Config here. --> </web-app>
См. Также:
- Документация по ключевому тегу JSTL для ключевого слова (для правильного taglib URI)
- Информационная страница тега JSTL (для ссылок загрузки JSTL и примеров
web.xml
)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
Все ответы в этом вопросе помогли мне, но я подумал, что добавлю дополнительную информацию для потомков.
Оказалось, что у меня была тестовая зависимость от gwt-test-utils
, которая привела к gwt-dev
. К сожалению, gwt-dev
содержит полную копию Jetty, JSP, JSTL и т. Д., Которая была впереди соответствующих пакетов на пути к классам. Поэтому, несмотря на то, что у меня были соответствующие зависимости от JSTL 1.2, он загружал версию версии 1.0 на gwt-dev
. Grumble.
Решение для меня состояло в том, чтобы не запускаться с областью тестирования, поэтому я не собираю пакет gwt-test-utils
во время выполнения. Удаление пакета gwt-dev
из пути к классам каким-либо другим способом также устранило бы проблему.
Добавьте jstl-1.2.jar
в папку tomcat/lib
.
При этом ваша ошибка зависимостей будет исправлена снова.
Устранена аналогичная проблема в IBM RAD 7.5, выбрав:
Я уже упоминал, что зависимость Maven в pom.xml неверна. Это должно быть
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
Я просто хотел добавить исправление, которое я нашел для этой проблемы. Я не уверен, почему это сработало. У меня была правильная версия jstl (1.2), а также правильная версия servlet-api (2.5)
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
У меня также был правильный адрес на моей странице, как предлагается в этом потоке, который является
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Что исправлено для меня, это удаление тега области из моего xml-файла в pom для моей зависимости jstl 1.2. Снова не уверен, почему это исправлено, но на тот случай, если кто-то делает весну с учебником JPA и Hibernate по множественности и имеет свою настройку pom таким образом, попробуйте удалить тег области и посмотреть, исправляет ли он это. Как я сказал, это сработало для меня.
Если вы все пробовали, но это не помогло, вы должны перезапустить сервер. В моем случае я просто забыл перезапустить Tomcat после добавления javax.servlet.jsp.jstl-1.2.1.jar
в lib
.
Я нашел еще одну причину такого типа ошибок: в моем случае кто-то установил свойство catalina.properties tomcat.util.scan.StandardJarScanFilter.jarsToSkip
на *
, чтобы избежать сообщений о предупреждении журнала, тем самым пропустив необходимое сканирование Tomcat. Изменение этой функции на Tomcat по умолчанию и добавление соответствующего списка банок для пропуска (не включая jstl-1.2 или spring-webmvc) решили проблему.
Я полностью отключил MAVEN и Spring. И мне пришлось добавить следующие банки для правильной работы моей среды.
Хуже всего было jstl-api-1.2.jar
и javax-servlet.jsp.jst-api-1.2.1.jar
Они просто не работали.
`jstl-1.2.jar работал хорошо.
blockquote>
@BalusC совершенно прав, но если вы все еще сталкиваетесь с этим исключением, это означает, что вы сделали неправильно. Самая важная информация, которую вы найдете, находится на странице SO JSTL Tag Info .
В основном это сводка того, что вам нужно сделать, чтобы справиться с этим исключением.
<web-app version="2.5">
Что делать с Tomcat 5 или 6:
Вам нужно включить соответствующие баннеры в ваш веб-сайт -INF / lib (он будет работать только для вашего приложения) или в tomcat / lib (будет работать глобально для всех приложений).
Последнее, что taglib в ваших jsp-файлах. Для JSTL 1.2 правильным является следующее:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Просто была аналогичная проблема в Eclipse, исправленная с помощью:
rightclick on project->Properties->Deployment Assembly->add Maven Dependencies
, что-то вытолкнуло это раньше, пока я редактировал мой pom.xml
У меня были все необходимые файлы jar, taglib uri и web.xml были в порядке