java - QueryDSL JPA 函数

标签 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')

我的方法比较日期

protected BooleanExpression dateCompare(DateTimePath<java.util.Date> dateTimePath, Date date) {
    DateExpression<Date> dbDate = SQLExpressions.datetrunc(DatePart.day, Expressions.asDate(dateTimePath));
    DateExpression<Date> compareDate = Expressions. asDate(date);
    return dbDate.eq(compareDate);
}

但是我有错误

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)

如何在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));
            }

我尝试使用这样的

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);
}

但是有错误

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

最佳答案

我决定这样做......

    protected enum TypeCompare {
                                EQ,
                                GT,
                                GOE,
                                LT,
                                LOE
    }
    private final static String ORACLE_DATE_FORMAT = "dd.mm.yyyy";

...

    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);
        }
    }

关于java - QueryDSL JPA 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45499989/

相关文章:

java - Spring - 支持 QueryDsl 的高级比较器

java - 从 SOAP wsdl 生成客户端 jar

spring-boot - @DataJpaTest 在 MySQL 中更新实际数据,但在 H2 中工作正常

mysql - JPA 从 View 中选择

java - 如何使用querydsl或spring data jpa规范对分层实体执行查询?

maven-plugin - "Either processor or processors need to be given"运行时 "mvn apt:process"

java - 创建一个 SortedSet(对象)并向其插入元素或创建一个 ArrayList 并在之后对其进行排序是否更快?

java - 带有路径参数和命令对象的 Springdoc-OpenAPI

java - Phpstorm 9 在索引时崩溃

java - 谷歌应用引擎 : understanding datastore transactions