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)
答案 0 :(得分:3)
供将来参考......
有人已发布类似问题here和here。 根据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"))
))
希望这有助于万一有其他人遇到同样的问题。