Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do i group by date only from date time field in JPQL

Tags:

java

jpa

jpql

For mysql I wrote a query like

SELECT * FROM mytable GROUP BY DATE(dateTimeField)

But i can't use the DATE() function in JPQL. Anyone have an idea how to resolve this problem?

like image 315
chula Avatar asked Sep 20 '11 09:09

chula


3 Answers

If You use Hibernate under the hood you can try :

  1. Create your own dialect with custom function

    public class CustomPostgresqlDialect extends PostgreSQLDialect {   
        public CustomPostgresqlDialect() {
            super();
            registerFunction("truncate_date",
            new SQLFunctionTemplate( StandardBasicTypes.TIMESTAMP, "DATE(?1)" ));
        }
    }
    
  2. Register Your dialect in persistence.xml

    <property name="hibernate.dialect" value="my.own.CustomPostgresqlDialect"/>
    
  3. Use your function in JPQL.

    select p from Post p group by truncate_date(p.dateCreated)
    
like image 135
Piotr Gwiazda Avatar answered Nov 15 '22 17:11

Piotr Gwiazda


For Hibernate:

Suggestion 1:

Use cast(dateTimeField as date). See here.

Suggestion 2:

You can try to concatenate year, month and year HQL expressions.

Take a look at line 360 of this testcase.

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

But take the time to see the generated SQL, it may (and probably will be) ugly and slow.

like image 24
Anthony Accioly Avatar answered Nov 15 '22 17:11

Anthony Accioly


If you are using EclipseLink you can use the FUNC() function in JPQL to call a specific database function:

Support for Native Database Functions Using FUNC

like image 42
James Avatar answered Nov 15 '22 17:11

James