Функции JPA Query МЕСЯЦ / ГОД

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

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

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


person jagbandhuster    schedule 09.09.2010    source источник


Ответы (5)


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

то есть FUNC ('МЕСЯЦ', c_Date)

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

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

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

person Community    schedule 09.09.2010
comment
Привет, Джеймс, Спасибо за ответ. На самом деле я использую основы топлинка. Я применил способ, как указано выше, но все же получаю: Неожиданный токен - FUNC. Пожалуйста помоги! - person jagbandhuster; 10.09.2010
comment
@venomrld Как писал Джеймс, эта функция FUNC доступна в EclipseLink 2.1+, см. Ошибка 300512. Так что не ожидайте найти его в TopLink Essentials. - person Pascal Thivent; 10.09.2010
comment
Так что я застрял. Пожалуйста, помогите, если есть какой-то способ. Я использую netbeans 6.5 и визуальные лица для разработки. Кажется, мне пришлось изменить довольно много кода для миграции. - person jagbandhuster; 10.09.2010

Я хочу запросить 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 быстрее выполняется.

person amrodelas    schedule 22.08.2011
comment
Спасибо за ответ ... На самом деле проблема, с которой я столкнулся, заключается в том, что значения являются динамическими ... т.е. значения берутся только из переменных ... Итак, я переключился на собственные SQL-запросы, и они отлично работают. В любом случае, еще раз спасибо. - person jagbandhuster; 22.08.2011

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


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

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

person Pascal Thivent    schedule 09.09.2010
comment
Привет! Для этого я использую Toplink Essentials. Пожалуйста, помогите, если в Toplink есть какая-то функция. Спасибо. - person jagbandhuster; 10.09.2010

После этого у меня работал спящий режим (4.3.9.Final) и JPA 2.1.

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

person suraj bahl    schedule 03.02.2016

если ваш класс содержит переменную типа даты, вы можете использовать такой запрос:

@Query("select m from Movement m where m.id_movement_type.id=1 and SubString(cast(m.date as text),1,4) = :year")
    List<Movement> buysForYear(@Param("year") String year);
person luisTercero_    schedule 10.04.2020