Выберите nvl(max(c.EmployeeId),0) в JPQL?

Я использую базу данных oracle10g и eclipselink, мне нужно получить последний вставленный ключ из таблицы, поэтому я создал этот запрос

javax.persistence.Query q =   
                    em.createQuery("SELECT nvl(MAX(c.myAtt),0) " +   
                        "from myTable as c");   
             return Integer.parseInt(q.getSingleResult().toString());   `

Но когда таблица пуста (иногда она может опустеть), я получаю ИЛегальное исключение аргумента, причина: JPQL Exception, detail: "Исключительная ситуация при создании запроса в EntityManager". Что я делаю не так?

4 ответа

NVL() теперь поддерживается в новых версиях jpql

Тем временем кто-то еще мог вставить что-то в Autorizaciones, и тогда вы получите неправильный идентификатор

Вы могли бы использовать COALESCE функция. Может использоваться для достижения того же, что и nvl, Например:

select nvl(columna,'1') from table
select COALESCE(columna,'1') from table

Перефразируя ВСУ, "я не знаю, какую часть этого вопроса исправить первым":-)

Прежде всего, получение последнего вставленного ключа таким способом является ОЧЕНЬ ПЛОХОЙ вещью © Это опасно, неэффективно и, самое главное, не нужно, поскольку ваш JPA уже делает это для вас: после того, как вы вставите свою сущность, ее свойство идентификатора будет автоматически обновлено до содержать его первичный ключ.

Во-вторых, что касается вашего запроса, "myTable" - это не то, что вы бы использовали в JPQL, вам нужно вместо этого указать имя вашей сущности (например, если вы отображаете "Car" в "CAR_TABLE", вы должны использовать "Car" вместо этого). "CAR_TABLE" в запросах JPQL).

В заключение, NVL() не поддерживается JPQL. Это поддерживается (вроде, через Expression.ifNull()) выражениями EclipseLink. Во всяком случае, вам не нужно это в таком сценарии.

Другие вопросы по тегам