For mysql I wrote a query like
SELECT * FROM mytable GROUP BY DATE(dateTimeField)
But i can\'t use the DATE()
function in JPQL
I'm afraid that's beyond the scope of what JPQL offers. You will have to resort to native queries.
Here's the List of available functions in JPQL:
Java EE Tutorial 6 > Persistence > JPQL > Functional Expressions
If You use Hibernate under the hood you can try :
Create your own dialect with custom function
public class CustomPostgresqlDialect extends PostgreSQLDialect {
public CustomPostgresqlDialect() {
super();
registerFunction("truncate_date",
new SQLFunctionTemplate( StandardBasicTypes.TIMESTAMP, "DATE(?1)" ));
}
}
Register Your dialect in persistence.xml
<property name="hibernate.dialect" value="my.own.CustomPostgresqlDialect"/>
Use your function in JPQL.
select p from Post p group by truncate_date(p.dateCreated)
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.
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