QueryDSL:QueryDSL 2.9.0中的ConstructorExpression和CaseBuilder的JPA示例

时间:2014-02-19 12:46:53

标签: java hibernate jpa groovy querydsl

public class ProductDTO {
   public ProductDTO(final String name, final Boolean isBrandNew) { ... }
}

QProduct product = QProduct.product

Expression<Boolean> isBrandNew = new CaseBuilder()
  .when(product.creaDate.eq(product.modDate)).then(Boolean.TRUE)
  .otherwise(Boolean.FALSE)
  .as("brandNewProduct")

JPAQuery query = new JPAQuery (this.em);
query.from(product)
     .where(product.name.eq("blah"))
     .listDistinct(ConstructorExpression.create(ProductDTO
     , product.name
     , isBrandNew))

在我的查询的最终选择语句中包含“brandNewProduct”列的CaseBuilder的正确设置是什么?

现在,我从休眠中得到的只是异常

    org.hibernate.hql.internal.ast.tree.ParameterNode cannot be cast to
    org.hibernate.hql.internal.ast.tree.SelectExpression
    org.hibernate.hql.internal.ast.tree.CaseNode.getFirstThenNode(CaseNode.java:43)

1 个答案:

答案 0 :(得分:3)

供将来参考......

有人已发布类似问题herehere。 根据Timo的说法,有一个bug或者说是hibernate强加的限制:

  

最佳答案   TimoWestkämper在2013-02-22T01:55:04-05:00回答   它在语法上是可行的,但目前Hibernate不支持。这是相关的票证https://github.com/mysema/querydsl/issues/185

所以,nithril发布的解决方案实际上对我有用:

  

query()。from(cat).list(cat.name.when(“Bob”)。then(Expressions.numberTemplate(Long,“1”))。否则(Expressions.numberTemplate(Long,“2”) )));

我最终使用了:

JPAQuery query = new JPAQuery (this.em);
  query.from(product)
 .where(product.name.eq("blah"))
 .listDistinct(ConstructorExpression.create(ProductDTO
 , product.name
 , product.modDate.when(product.creaDate)
                  .then(Expressions.booleanTemplate("true"))
                  .otherwise(Expressions.booleanTemplate("false"))

))

希望这有助于万一有其他人遇到同样的问题。