2015-11-03 24 views
1

我能够建立使用JPA标准构建标准Case语句和NVL与标准API - 抛出:IllegalArgumentException:属性[SingularAttributeImpmappings.DirectToFieldMapping

Java代码片断

cq.multiselect(root.get(ProductCatalogue_.userId),root.get(ProductCatalogue_.productList)); 

    Join<ProductCatalogue, ProductList> joinList = root.join(ProductCatalogue_.productList, JoinType.LEFT); 
    Join<ProductCatalogue, ProductEmp> joinEmp = root.join(ProductCatalogue_.productEmp, JoinType.LEFT); 

我这里面临不确定问题如何使用case语句与我在SQL

使用了上面的代码和NVL

更新1

criteriaQuery.multiselect(root.get(ProductCatalogue_.userId), 
root.get(ProductCatalogue_.productList),criteriaBuilder.selectCase(). 
when(criteriaBuilder.equal(root.get(ProductCatalogue_.prodId),"ZCX"), 
rootPr.get(ProductList_.prodDesc + " # " + 
rootEmp.get(ProductEmp_.empNo))).otherwise(rootPr.get(ProductList_.prodDesc)); 

异常

java.lang.IllegalArgumentException异常:属性[SingularAttributeImpl [org.eclipse.persistence.mappings.DirectToFieldMapping [prodDesc - > PRODUCT_LISTS.prodDesc]]]从被管理型[EntityTypeImpl @ 3567635:ProductList [javaType:class test.entity.ProductList descriptor:RelationalDescriptor(test.entity.ProductList - > [DatabaseTable(PRODUCT_LISTS)]),mappings:5]]不存在。

更新2

Expression<String> stringConcat = 
criteriaBuilder.concat(criteriaBuilder.concat(rootPr.get(ProductList_.prodDesc), " # "), 
rootEmp.get(ProductEmp_.empNo)); 

错误

缺少右括号

因为那时SQL的一部分,有一个问号,因为它是需要一个参数

THEN (t0.prodDesc = ?) 
+0

在JPA标准,NVL具有等效的。 'CriteriaBuilder.coalesce()'。 CASE也有等价的:'CriteriaBuilder.selectCase()' – Ish

+0

@NeilStockton我已经尝试过使用Case但是它导致了错误,我用我的Case语句和异常更新了我的问题。你可以好好看看。不确定我的'multiselect'中的case语句是否正确! – user75ponic

+0

@Ish我试过使用案例,但它导致了错误,我用我的Case语句和异常更新了我的问题。你可以好好看看。 – user75ponic

回答

1

我在这里看到两个问题。首先,Path#get(String)需要一个属性名称,因此您不能传递字符串连接。其次,如果要选择字符串连接的结果,则必须使用CriteriaBuilder#concat()而不是使用+运算符连接的纯java字符串。

所以我会尝试这个办法:使用其他selectCase()语句上CriteriaBuilder#isNull()结果

Expression<String> stringConcat = criteriaBuilder.concat(
    criteriaBuilder.concat(rootPr.get(ProductList_.prodDesc), " # "), 
    rootEmp.get(ProductEmp_.empNo)); 

criteriaQuery.multiselect(root.get(ProductCatalogue_.userId), 
    root.get(ProductCatalogue_.productList), 
    criteriaBuilder.selectCase() 
     .when(criteriaBuilder.equal(root.get(ProductCatalogue_.prodId),"ZCX"), stringConcat) 
     .otherwise(rootPr.get(ProductList_.prodDesc))); 

最后,NVL部分应建:

Expression<Long> userId = criteriaBuilder.selectCase() 
    .when(criteriaBuilder.isNull(rootEmp.get(ProductEmp_.userId)), root.get(ProductCatalogue_.userId)) 
    .otherwise(rootEmp.get(ProductEmp_.userId)); 
+0

它是'Path'还是'Expression'? – user75ponic

+1

我尝试过Path,但是我得到了以下错误:'javax.persistence.criteria.Path 预期但是javax.persistence.criteria.Expression found'。所以我用'Expression'尝试过。我用Expression代码片断更新了我的问题。 – user75ponic

+0

你可以更新你的答案,因为我已经使用Expression而不是Path,并且我能够摆脱丢失的括号错误。 – user75ponic