i'm trying compute average date difference using querydsl.
i created a small project demonstrate i'm trying accomplish, in simplified manner (the real query lot more complex, tons of joins / / sort clauses). have customer class birthdate field, , trying average age, in seconds, of our customers. want maximum age, let's focus on average post.
i tried writing query using querydsl-jpa, fails obscure error:
java.lang.nullpointerexception @ org.hibernate.dialect.function.standardansisqlaggregationfunctions$avgfunction.determinejdbctypecode(standardansisqlaggregationfunctions.java:106) @ org.hibernate.dialect.function.standardansisqlaggregationfunctions$avgfunction.render(standardansisqlaggregationfunctions.java:100) @ org.hibernate.hql.internal.ast.sqlgenerator.endfunctiontemplate(sqlgenerator.java:233) [...] i tried other approaches, using numbertemplate.create(double.class, "{0} - {1}", dateexpression.currentdate(), customer.birthdate).avg(), doesn't return correct value. if want date difference in seconds, seems need find way of calling database-specific date/time difference functions, not use minus sign.
sadly, computing date difference doesn't seem possible in jpql, guess querydsl-jpa has limitations there too. have write native sql query, or find hack have querydsl-generated jpql call native database function.
jpa 2.1 added support invoking database functions, there problem: mysql function takes form timestampdiff(second, '2012-06-06 13:13:55', '2012-06-06 15:20:18'). possible if first parameter (second) string, seems reference kind of constant, , seems complicated generate jpql first parameter unquoted.
querydsl added support date differences, seems of code resides in querydsl-sql project, i'm wondering if can benefit querydsl-jpa.
here questions:
is possible compute average date difference using querydsl-jpa, having maybe call native database functions using jpa 2.1 support (maybe using
expressions.numbertemplate())? or forced use querydsl-sql?if have use querydsl-sql, how generate both
qcustomer,scustomer?qcustomergenerated customer entity using plugin "com.mysema.maven:apt-maven-plugin". if understood correctly, i have use different plugin (com.querydsl:querydsl-maven-plugin) generatescustomerquery type?when looking @ querydsl-sql-example, don't see entity class, guess query types generated querydsl database schema? there way generate scustomer query type entity instead, querydsl-jpa?
if use querydsl-sql, there way "re-use" our querydsl-jpa predicates / sorts / joins clauses in querydsl-sql query? or have duplicate code using querydsl-sql-specific classes?
i'm considering creating database function delegates
timestampdiff(second, x, y), it's not portable...am missing something? there simpler way of doing i'm trying do?
using template expressions should able inject custom jpql snippets querydsl query. should answer first question.
using both querydsl-jpa , querydsl-sql in same project possible, adds complexity.
Comments
Post a Comment