Java QueryDSL JPA函数
我使用querydsl jpa和querydsl sql 4.1.4 想要运行简单的sql吗Java QueryDSL JPA函数,java,jpa,querydsl,Java,Jpa,Querydsl,我使用querydsl jpa和querydsl sql 4.1.4 想要运行简单的sql吗 /* Formatted on 04/08/2017 9:46:39 (QP5 v5.300) */ SELECT created FROM user_info WHERE TRUNC (created) <= TO_DATE ('01.01.2016', 'dd.mm.yyyy') 如何在QueryDSL中正确使用TRUNC和to_DATE 例如,在JPA中,我使用这样的代码 if (t
/* Formatted on 04/08/2017 9:46:39 (QP5 v5.300) */
SELECT created
FROM user_info
WHERE TRUNC (created) <= TO_DATE ('01.01.2016', 'dd.mm.yyyy')
如何在QueryDSL中正确使用TRUNC和to_DATE
例如,在JPA中,我使用这样的代码
if (transferFilter.getTransactionEnd() != null) {
Expression<Date> transactionEnd = qb.function("TRUNC", Date.class, root.get(TransferLog_.transaction));
Expression<Date> tillDate = qb.function("TO_DATE", Date.class, qb.literal(DateUtils.formatRuDate(transferFilter.getTransactionEnd(), "")), qb.literal("dd.mm.yyyy"));
predicates.add(qb.greaterThanOrEqualTo(transactionEnd, tillDate));
}
if(transferFilter.getTransactionEnd()!=null){
表达式transactionEnd=qb.function(“TRUNC”,Date.class,root.get(TransferLog\uuuu.transaction));
表达式tillDate=qb.function(“TO_DATE”,DATE.class,qb.literal(DateUtils.formatRuDate(transferFilter.getTransactionEnd(),”),qb.literal(“dd.mm.yyyy”);
add(qb.greaterThanOrEqualTo(transactionEnd,tillDate));
}
我试着用这种方法
protected BooleanExpression dateCompare(DateTimePath<java.util.Date> dateTimePath, Date date) {
DateExpression<Date> dbDate = Expressions.dateTemplate(Date.class, "TRUNC({0})", dateTimePath);
DateExpression<Date> compareDate = Expressions.dateTemplate(Date.class, "TO_DATE({0}, {1})", DateUtils.formatRuDate(date), ORACLE_DATE_FORMAT);
// DateExpression<Date> dbDate = SQLExpressions.datetrunc(DatePart.day, Expressions.asDate(dateTimePath));
// DateExpression<Date> compareDate = Expressions. asDate(date);
return dbDate.eq(compareDate);
}
受保护的布尔表达式dateCompare(DateTimePath DateTimePath,Date-Date){
DateExpression dbDate=Expressions.dateTemplate(Date.class,“TRUNC({0})”,dateTimePath);
DateExpression compareDate=Expressions.dateTemplate(Date.class,“TO_Date({0},{1})”,DateUtils.formatRuDate(Date),ORACLE_Date_格式);
//DateExpression dbDate=SQLExpressions.datetrunc(DatePart.day,Expressions.asDate(dateTimePath));
//DateExpression compareDate=表达式.asDate(日期);
返回dbDate.eq(比较);
}
但是有错误
Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Syntax error parsing [select transferLog
from TransferLog transferLog
where trunc_day(transferLog.transaction) = ?1].
[54, 93] The expression is not a valid conditional expression.
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1616)
Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.6.4.v20160829-44060b6): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Syntax error parsing [select transferLog
from TransferLog transferLog
where TRUNC(transferLog.transaction) = TO_DATE(?1, ?2)].
[54, 102] The expression is not a valid conditional expression.
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
at org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:102)
at org.eclipse.persistence.internal.jpa.EJBQueryImpl.<init>(EJBQueryImpl.java:86)
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1614)
... 219 more
原因:异常[EclipseLink-0](Eclipse持久性服务-2.6.4.v20160829-44060b6):org.Eclipse.Persistence.exceptions.JPQLException
异常描述:语法错误分析[选择transferLog]
来自TransferLog TransferLog
其中TRUNC(transferLog.transaction)=截止日期(?1,?2)]。
[54102]表达式不是有效的条件表达式。
位于org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildException(HermesParser.java:155)
位于org.eclipse.persistence.internal.jpa.jpql.HermesParser.validate(HermesParser.java:334)
位于org.eclipse.persistence.internal.jpa.jpql.HermesParser.populateQueryImp(HermesParser.java:278)
位于org.eclipse.persistence.internal.jpa.jpql.HermesParser.buildQuery(HermesParser.java:163)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:142)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:116)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl(EJBQueryImpl.java:102)
位于org.eclipse.persistence.internal.jpa.EJBQueryImpl.(EJBQueryImpl.java:86)
位于org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1614)
... 219更多
我决定这样做是为了
protected enum TypeCompare {
EQ,
GT,
GOE,
LT,
LOE
}
private final static String ORACLE_DATE_FORMAT = "dd.mm.yyyy";
受保护的布尔表达式dateCompare(DateTimePath DateTimePath、Date-Date、TypeCompare-TypeCompare){
StringTemplate dbDate=Expressions.StringTemplate(“函数('TRUNC',{0})”,dateTimePath);
StringTemplate compareDate=Expressions.StringTemplate(“函数('TO_DATE',{0},{1})”,DateUtils.formatRuDate(DATE),ORACLE_DATE_格式);
开关(类型比较){
案例等式:
返回dbDate.eq(比较);
案例GT:
返回dbDate.gt(比较日期);
案例专家组:
返回dbDate.goe(比较日期);
案例LT:
返回dbDate.lt(比较数据);
案例LOE:
返回dbDate.loe(比较数据);
违约:
返回dbDate.eq(比较);
}
}
我决定这样做是为了
protected enum TypeCompare {
EQ,
GT,
GOE,
LT,
LOE
}
private final static String ORACLE_DATE_FORMAT = "dd.mm.yyyy";
受保护的布尔表达式dateCompare(DateTimePath DateTimePath、Date-Date、TypeCompare-TypeCompare){
StringTemplate dbDate=Expressions.StringTemplate(“函数('TRUNC',{0})”,dateTimePath);
StringTemplate compareDate=Expressions.StringTemplate(“函数('TO_DATE',{0},{1})”,DateUtils.formatRuDate(DATE),ORACLE_DATE_格式);
开关(类型比较){
案例等式:
返回dbDate.eq(比较);
案例GT:
返回dbDate.gt(比较日期);
案例专家组:
返回dbDate.goe(比较日期);
案例LT:
返回dbDate.lt(比较数据);
案例LOE:
返回dbDate.loe(比较数据);
违约:
返回dbDate.eq(比较);
}
}
protected BooleanExpression dateCompare(DateTimePath<java.util.Date> dateTimePath, Date date, TypeCompare typeCompare) {
StringTemplate dbDate = Expressions.stringTemplate("function('TRUNC', {0})", dateTimePath);
StringTemplate compareDate = Expressions.stringTemplate("function('TO_DATE', {0}, {1})", DateUtils.formatRuDate(date), ORACLE_DATE_FORMAT);
switch (typeCompare) {
case EQ:
return dbDate.eq(compareDate);
case GT:
return dbDate.gt(compareDate);
case GOE:
return dbDate.goe(compareDate);
case LT:
return dbDate.lt(compareDate);
case LOE:
return dbDate.loe(compareDate);
default:
return dbDate.eq(compareDate);
}
}