2015-11-03 60 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