OpenJPA 生成以下 where sql 部分
WHERE (t3.USERNAME = ? AND CAST(1 AS INTEGER) <> CAST(1 AS INTEGER)
AND t5.USERNAME IS NOT NULL AND 1 = 1 AND 1 = 1 AND 1 = 1)
我刚刚加入了几张桌子,最后做到了
Join<SomeEntity, User> userJoin = someJoin.join(SomeEntity_.user);
Path<String> usernamePath = userJoin.get(User_.username);
CriteriaBuilder cb = getCb();
Predicate usernamePredicate = cb.equal(usernamePath, username);
JPA 发送到数据库的 sql 中奇怪的部分是
CAST(1 AS INTEGER) <> CAST(1 AS INTEGER)
这个表达式永远是错误的。所以永远不会有用户被选中。
好的,还有
1 = 1 AND 1 = 1 AND 1 = 1
表达式真的很奇怪,但是数据库的查询优化器应该删除它们,因为它们是真实的。
- 是否有人拥有由 OpenJPA 生成的相同或相似的奇怪 sql 语句?
- 谁能告诉我(希望是 OpenJPA 开发人员)为什么 OpenJPA 会生成如此奇怪的语句?
研究继续
今天在 OpenJPA 2.2.1 源码中找到了生成语句的地方。我截取了调试会话的屏幕截图并标记了有趣的地方。
放大1:http: //i.stack.imgur.com/LBmzM.png