Как сгруппировать по дате только из поля даты и времени в JPQL

Для mysql я написал запрос типа

SELECT * FROM mytable GROUP BY DATE(dateTimeField)

Но я не могу использовать функцию DATE() в JPQL. Кто-нибудь знает, как решить эту проблему?


person chula    schedule 20.09.2011    source источник


Ответы (4)


Если вы используете Hibernate под капотом, вы можете попробовать:

  1. Создайте свой собственный диалект с пользовательской функцией

    public class CustomPostgresqlDialect extends PostgreSQLDialect {   
        public CustomPostgresqlDialect() {
            super();
            registerFunction("truncate_date",
            new SQLFunctionTemplate( StandardBasicTypes.TIMESTAMP, "DATE(?1)" ));
        }
    }
    
  2. Зарегистрируйте свой диалект в persistence.xml

    <property name="hibernate.dialect" value="my.own.CustomPostgresqlDialect"/>
    
  3. Используйте свою функцию в JPQL.

    select p from Post p group by truncate_date(p.dateCreated)
    
person Piotr Gwiazda    schedule 20.09.2011
comment
При использовании построителя критериев у меня сработало следующее: cb.function("truncate_date", Date.class, fromTable.get("dateCreated")); - person brntsllvn; 02.04.2019

Для спящего режима:

Предложение 1:

Используйте 1_. См. здесь.

Предложение 2:

Вы можете попытаться объединить year, month и year Выражения HQL.

Взгляните на строку 360 этого теста.

str(year(current_date))||'-'||str(month(current_date))||'-'||str(day(current_date))

Но найдите время, чтобы увидеть сгенерированный SQL, он может быть (и, вероятно, будет) уродливым и медленным.

person Anthony Accioly    schedule 20.09.2011
comment
EclipseLink также поддерживает CAST, см. wiki.eclipse.org/EclipseLink/ Руководство пользователя/JPA/ - person Jasper de Vries; 14.03.2016

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

Поддержка собственных функций базы данных с использованием FUNC

person James    schedule 20.09.2011

Боюсь, это выходит за рамки того, что предлагает JPQL. Вам придется прибегнуть к нативным запросам.

Вот список доступных функций в JPQL:

Java EE Tutorial 6 > Persistence > JPQL > Functional Expressions

person Sean Patrick Floyd    schedule 20.09.2011