2014-02-19 102 views
1
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)) 

什麼是對CaseBuilder將包括在我的查詢的最終SELECT語句「brandNewProduct」欄的正確設置JPA例如用於ConstructorExpression和CaseBuilder?QueryDSL:在QueryDSL 2.9.0

目前,所有我從休眠狀態得到的是異常

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) 

回答

3

以備將來參考以下...

有人已發佈了類似的問題herehere。 根據蒂莫,有一個bug或假設由休眠強加的限制:55:

最佳答案 由蒂莫Westk ä MPER上2013-02-22T01回答04-05:00 這是語法上可能,但目前Hibernate不支持。這裏有一個相關的票https://github.com/mysema/querydsl/issues/185

所以,張貼nithril解決實際工作對我來說:

查詢()從(貓).LIST(cat.name.when( 「鮑勃」 ).then(Expressions.numberTemplate(Long,「1」))。otherwise(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")) 

))

希望這有助於萬一別人有同樣的問題。