gpt4 book ai didi

hibernate - 如何使用 JPA Criteria Api 使用文字参数调用 db2 数据库函数?

转载 作者:行者123 更新时间:2023-12-03 22:15:29 24 4
gpt4 key购买 nike

我有一个 DB2 数据库函数,声明如下:

CREATE FUNCTION MYDB.FN_ISNEWSCOVERAGE(NEWS_ID INTEGER, USERID VARCHAR(50))
RETURNS INTEGER
...

它包含一些复杂的 SQL 逻辑并返回 1 或 0(表示真/假)。

我正在尝试使用该函数来过滤使用 JPA Criteria API(通过 Spring 3/Hibernate)构造的查询中的结果,如下所示:
EntityManager em = ...
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<News> cq = cb.createQuery(News.class);
Root<News> news = cq.from(News.class);
Predicate criteria = cb.conjunction();
...
String userid = ...
criteria = cb.and( criteria,
cb.equal( cb.function( "MYDB.FN_ISNEWSCOVERAGE",
Long.class,
news.get("id"),
cb.<String>literal( userid ) ),
1 )
);
...
TypedQuery<News> tq = em.createQuery(cq);
List<News> results = tq.getResultList();
...

问题是当结果查询运行时,db2 抛出一个错误:
Caused by: com.ibm.db2.jcc.b.eo: DB2 SQL Error: SQLCODE=-418, SQLSTATE=42610, SQLERRMC=null, DRIVER=3.53.95

描述为 here .问题似乎是生成的 SQL 包含一个 '?' MYDB.FN_ISNEWSCOVERAGE 函数参数之一的位置参数 - 这是生成的查询字符串的相关部分:
SELECT ... from MYDB.NEWS news0_ where 1=1 and news0_.ACTIVE=? and MYDB.FN_ISNEWSCOVERAGE(news0_.NEWS_ID, ?)=1

如果我将生成的查询复制到 sql 客户端并用文字值替换位置参数,则查询运行良好。

从 JPA Criteria API 调用数据库函数时,有没有办法避免这个错误?

更新

我意识到我可以通过使用子查询用路径表达式替换文字函数参数来绕过这个问题,如下所示:
Subquery<News> sq = cq.subquery(News.class);
Root<News> sqNews = sq.correlate(news);
Root<User> sqUser = sq.from(User.class);
sq.select(news)
.where(
cb.equal(sqUser.get("id"), userid),
cb.equal(cb.function("MYDB.FN_ISNEWSCOVERAGE",
Long.class,
sqNews.get("id"),
sqUser.get("id")),
1)
);
criteria = cb.and(cb.exists(sq));

但是,此解决方法可能不适用于其他情况 - 有更好的解决方案吗?

最佳答案

尽管这是一个老问题,但我们今天遇到了同样的问题。
由于问题是“?”我们选择强制 hibernate 来内联文字的参数。

properties.put(AvailableSettings.CRITERIA_LITERAL_HANDLING_MODE, LiteralHandlingMode.INLINE);
有关 Hibernate 如何处理文字的进一步说明: https://vladmihalcea.com/how-does-hibernate-handle-jpa-criteria-api-literals/

关于hibernate - 如何使用 JPA Criteria Api 使用文字参数调用 db2 数据库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8619435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com