Функции запроса JPA MONTH/YEAR

Как я могу написать запрос JPA с помощью функции MONTH так же, как sql-запрос?

@NamedQuery(name="querybymonth", query="select t from table1 t where MONTH(c_Date) = 5")

Когда я использую шаблон выше для запроса, я получаю сообщение об ошибке: unexpected token - MONTH.

Ответы

Ответ 1

Если вы используете EclipseLink (2.1), вы можете использовать функцию FUNC() для вызова любой функции базы данных, которая не определена в спецификации JPA JPQL.

то есть. FUNC ('MONTH', c_Date)

В JPA 2.1 (EclipseLink 2.5) синтаксис FUNCTION становится частью спецификации (и заменяет FUNC, специфичный для EclipseLink).

Если вы используете TopLink Essentials, вы не можете сделать это в JPQL, но вы можете определить для него запрос выражения TopLink (аналогично критериям JPA 2.0) или использовать собственный SQL.

Также, если вы используете поставщика JPA 2.0 и используете запрос Criteria, существует API-интерфейс функции(), который можно использовать для определения этого.

Ответ 2

Я хочу запросить YEAR (itemDate), но функция не выходит, тогда я увидел функцию SUBSTRING(), так что я сделал это Select q from table where SUBSTRING(itemDate, 1, 4)='2011' и это работает для меня! надеюсь, что это поможет!

если вам нужна динамическая переменная, вы тоже можете это сделать. здесь: poDate - это год, который используется в setParameter();

@NamedQuery(name = "PurchaseOrders.findByYear", query = "SELECT p FROM PurchaseOrders p WHERE SUBSTRING(p.poDate, 1, 4) = :poDate")

Query q = em.createNamedQuery("PurchaseOrders.findByYear");
q.setParameter("poDate", s_year+"");

но если все будет в порядке с вашими решениями, все будет хорошо. я просто нахожу JPA быстрее, чтобы выполнить.

Ответ 3

Функция MONTH() существует в Hibernate HQL, но не является стандартной функцией JPA. Возможно, ваш поставщик JPA имеет собственный эквивалент, но вы его не упомянули. Если это не так, вернитесь к родному SQL.


Я использую Toplink Essentials для этого же. Пожалуйста, помогите, если какая-либо функция существует в Toplink. Спасибо.

Насколько я знаю, TopLink не имеет прямого эквивалента. Поэтому либо используйте собственный SQL-запрос, либо, возможно, запрос Expression TopLink (не уверен в этом, и не уверены, что это доступно в TopLink Essentials).

Ответ 4

Следующее работало для меня с гибернацией (4.3.9.Final) и JPA 2.1.

@NamedQuery (name = "PartyEntity.findByAID", query = "выберите отдельный psc.party из PartyShortCode psc где (psc.shortCode =: helpNumber или FUNCTION ('REPLACE', psc.accountReference, '', '') =: helpNumber) и psc.sourceSystem в: sourceSystem" )