2013-06-25 30 views
4

OpenJPA中生成以下其中的SQL部分OpenJPA的产生怪异的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 

表情很古怪,但数据库的查询优化器应该删除他们,因为他们 是永远正确的。

  1. 有没有人有与OpenJPA生成相同或相似的奇怪的SQL语句?
  2. 谁能告诉我(希望有人的OpenJPA的开发者)为什么OpenJPA的 产生这种奇怪的声明?

研究的推移

今天,我发现在生成的语句OpenJPA的2.2.1源代码的地方。 我截取了我的调试会话并标记了有趣的地方。

放大1http://i.stack.imgur.com/LBmzM.png

enter image description here

+0

请问您可以添加评论为什么您投下了这个问题?我不是在开玩笑。 sql语句的where子句由openjpa生成。我将在明天继续进行研究,并快速提供有关我的问题的更多信息。 –

+0

找到生成1 = 1表达式的地方。例如。 http://svn.apache.org/repos/asf/openjpa/tags/2.2.1/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/BindVariableExpression.java –

+0

Is there一种可以插入可放大图像的方式?好的,我找到了一种方法...只需添加图像链接。 –

回答

3

解决

我终于找到了发生在导致要产生这种奇怪的说法OpenJPA的2.2.1源代码。

解释是非常interresting甚至我的问题的原因位于我的代码 ,因为我从来没有预料到OpenJPA创建这样一个声明。

,当你在表达“中值”集合创建SQL与空它发生。 例如:

Collection<String> usernames = .... // dynamically created 
            // (maybe by another query before) 
Path<String> username = userJoin.get(User_.username); 
Predicate usernamePredicate = username.in(usernames); 

当用户名集合为空,你会得到通过OpenJPA中产生的怪异SQL。 好的,如果用户名集合是空的,SQL-in表达式将会计算为 false。 我认为OpenJPA开发人员希望通过生成一个SQL表达式来使数据库优化器的生活更容易 ,在这种情况下,SQL表达式将被评估为false。 因此,他们在SQL语句中放置了

CAST(1 AS INTEGER) <> CAST(1 AS INTEGER) 

到目前为止,我能理解的目的是什么,但他们为什么不能让我们的生活的 开发商也更容易通过生成SQL,让我们知道他们为什么产生 的总是假的表达。例如,这个陈述可以更清楚地表明它是否能够向人类提供关于正在发生的事情的信息(一个提示)。 例如:

WHERE 'user.username in(emptyCollection)' IS NOT NULL; 

这也将始终为假,但开发人员可能不懂的问题是什么。