Как сгруппировать по дате только из поля даты и времени в JPQL - PullRequest
5 голосов
/ 20 сентября 2011

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

SELECT * FROM mytable GROUP BY DATE(dateTimeField)

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

Ответы [ 4 ]

3 голосов
/ 20 сентября 2011

Для Hibernate:

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

Используйте cast(dateTimeField as date). Смотри здесь .

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

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

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

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

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

2 голосов
/ 20 сентября 2011

Если вы используете 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)
    
1 голос
/ 20 сентября 2011

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

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

0 голосов
/ 20 сентября 2011

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

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

Учебник по Java EE 6> Постоянство> JPQL> Функциональные выражения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...