案例陈述和带有Criteria API的NVL - IllegalArgumentException:属性[SingularAttributeImpmappings.DirectToFieldMapping

时间:2015-11-03 12:12:19

标签: jpa eclipselink jpa-2.0 criteria criteria-api

我可以使用JPA Criteria Builder

构建标准

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 - &gt; PRODUCT_LISTS.prodDesc]]] [EntityTypeImpl @ 3567635:ProductList [javaType:class test] .entity.ProductList描述符:RelationalDescriptor(test.entity.ProductList - &gt; [DatabaseTable(PRODUCT_LISTS)]),映射:5]]不存在。

更新2

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

错误

  

缺少右括号

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

THEN (t0.prodDesc = ?) 

1 个答案:

答案 0 :(得分:2)

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

因此我会尝试这个:

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)));

最后,应使用selectCase()结果上的另一个CriteriaBuilder#isNull()语句构建NVL部分:

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