【发布时间】:2015-11-05 07:12:55
【问题描述】:
我有以下表达式来连接两列
Expression<String> stringConcat =
criteriaBuilder.concat(criteriaBuilder.concat(rootPr.get(ProductList_.prodDesc), " # "),
rootEmp.get(ProductEmp_.empNo));
它在 CriteriQuery 中以如下方式使用,
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)));
但是当生成 SQL 时,它会抛出错误
缺少右括号
因为在if else 部分 SQL 有一个问号,因为它需要一个参数
THEN (t0.prodDesc = ?)
如何解决这个问题?
【问题讨论】:
-
为什么不显示为该条件查询生成的完整 SQL 而不是一些快照。然后提及哪个 JPA 提供者。然后,如果它生成不正确的 SQL,则向您的 JPA 提供程序提出错误(他们都有错误并且需要了解这些事情)
-
和 ProductEmp_ ...这与候选实体有什么关系?它的连接在哪里?要验证是否是导致问题的“concat”...只需执行 Criteria 查询选择“concat”并查看它是否将此参数放在那里
-
rootEmp 是什么?在不知道它是什么的情况下无法评论那个 concat。如前所述...尝试使用仅将 concat 作为选择子句的基本条件查询,仅测试 concat(即没有 CASE)
-
@NeilStockton 没有
case声明concat效果很好。添加大小写时,会引发错误。 -
您使用的是哪个 EclipseLink 版本? There was a bug exactly on this issue,在 2.4.2 版本中修复。我可以在 2.5.2 中测试相同的代码并且工作正常。
标签: jpa eclipselink jpa-2.0 criteria-api