我可以使用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 = ?)
答案 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));