OpenJPA查询生成的SQL语句,为何Or后面没有括号
2012-04-12 20:48
1486 查看
事情就是在上周,我在Eclipse里写了一段查询语句,但是根据OpenJPA生成的SQL语句查询出来的数据,和预期的不一样。通过查看OpenJPA生成的SQL语句,终于发现OpenJPA在Or之前吞掉了我的括号。
现在,我们来还原一下现场,我最初的JPA查询语句是这样写的:
SELECT b FROM BorrowDocument b where b.borrowApprove.approveStatus= 'Approved' and (b.borrowApprove.borrowDocumentType = 'ElectronicBorrow' or (b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned'))
OpenJPA生成的语句是这样的:
SELECT t0.PK_BORROWDOCUMENT_ID, t0.bookCount, t0.bookStatus,
t1.PK_BORROWAPPROVE_ID, t1.applyTime, t1.approveComments,
t1.approveStatus, t1.approveTime, t1.approverId, t1.approverName,
t1.borrowDocumentType, t1.borrowProcessType, t1.borrowPurpose,
t1.borrowType, t1.borrowerDept, t1.borrowerId, t1.borrowerName,
t1.processId, t1.returnDate, t0.borrowCopies, t0.docId, t0.docName,
t0.isFixed, t0.lendTime, t0.lentCount, t0.recordCode, t0.returnCount,
t0.returnTime, t0.securityLevel
FROM T_SYNM_BORROWDOCUMENT t0, T_SYNM_BORROWAPPROVE t1
WHERE (t1.approveStatus = ? AND (t1.borrowDocumentType = ? OR
t1.borrowDocumentType = ? AND t0.bookStatus = ?)) AND
t0.BORROWAPPROVEID = t1.PK_BORROWAPPROVE_ID AND ROWNUM <= ?
[params=?, ?, ?, ?, ?]
通过对比,可以发现OpenJPA在or (b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned'))之后,生成SQL语句的过程中,Or后面的括号并没有被添加上。这是为什么呢?如果我们将Or后面的条件置前,是不是生成SQL语句还是没有括号。带着这个疑问,我将Or的条件置前了。
SQL查询语句是这样的:
SELECT b FROM BorrowDocument b where b.borrowApprove.approveStatus= 'Approved' and ((b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned') or (b.borrowApprove.borrowDocumentType = 'ElectronicBorrow'))
OpenJPA生成的语句是这样的:
可以看出,这次OpenJPA仍然没有在生成SQL语句Or后面加上括号,但是这次的查询结果却是正确的。这是为什么呢?根据运算符的优先级顺序,or总是在And之后,OpenJPA为提高查询效率,在第一层总是尽可能的过滤掉更多的数据,如果将or提前查询,第一层过滤的数据就会减少,从而造成查询效率低下。OpenJPA自以为是的过滤掉了我所添加的括号,只不过现在是查询出来的数据完全是错误的数据了。
通过OpenJPA查询所出现的一个小问题,提醒我。不要只是把功能放在第一位,简单、高效的程序才是程序员应该追求的目标。
现在,我们来还原一下现场,我最初的JPA查询语句是这样写的:
SELECT b FROM BorrowDocument b where b.borrowApprove.approveStatus= 'Approved' and (b.borrowApprove.borrowDocumentType = 'ElectronicBorrow' or (b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned'))
OpenJPA生成的语句是这样的:
SELECT t0.PK_BORROWDOCUMENT_ID, t0.bookCount, t0.bookStatus,
t1.PK_BORROWAPPROVE_ID, t1.applyTime, t1.approveComments,
t1.approveStatus, t1.approveTime, t1.approverId, t1.approverName,
t1.borrowDocumentType, t1.borrowProcessType, t1.borrowPurpose,
t1.borrowType, t1.borrowerDept, t1.borrowerId, t1.borrowerName,
t1.processId, t1.returnDate, t0.borrowCopies, t0.docId, t0.docName,
t0.isFixed, t0.lendTime, t0.lentCount, t0.recordCode, t0.returnCount,
t0.returnTime, t0.securityLevel
FROM T_SYNM_BORROWDOCUMENT t0, T_SYNM_BORROWAPPROVE t1
WHERE (t1.approveStatus = ? AND (t1.borrowDocumentType = ? OR
t1.borrowDocumentType = ? AND t0.bookStatus = ?)) AND
t0.BORROWAPPROVEID = t1.PK_BORROWAPPROVE_ID AND ROWNUM <= ?
[params=?, ?, ?, ?, ?]
通过对比,可以发现OpenJPA在or (b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned'))之后,生成SQL语句的过程中,Or后面的括号并没有被添加上。这是为什么呢?如果我们将Or后面的条件置前,是不是生成SQL语句还是没有括号。带着这个疑问,我将Or的条件置前了。
SQL查询语句是这样的:
SELECT b FROM BorrowDocument b where b.borrowApprove.approveStatus= 'Approved' and ((b.borrowApprove.borrowDocumentType = 'PaperBorrow' and b.bookStatus = 'Returned') or (b.borrowApprove.borrowDocumentType = 'ElectronicBorrow'))
OpenJPA生成的语句是这样的:
可以看出,这次OpenJPA仍然没有在生成SQL语句Or后面加上括号,但是这次的查询结果却是正确的。这是为什么呢?根据运算符的优先级顺序,or总是在And之后,OpenJPA为提高查询效率,在第一层总是尽可能的过滤掉更多的数据,如果将or提前查询,第一层过滤的数据就会减少,从而造成查询效率低下。OpenJPA自以为是的过滤掉了我所添加的括号,只不过现在是查询出来的数据完全是错误的数据了。
通过OpenJPA查询所出现的一个小问题,提醒我。不要只是把功能放在第一位,简单、高效的程序才是程序员应该追求的目标。
相关文章推荐
- ThinkPHP 查询生成的sql语句
- Oracle:sql语句查询没有重复的记录数目
- SQL SERVER2000教程-第五章 处理数据 第二十二节 利用UNION对多条SQL查询语句合并生成表
- sql语句,oracal更新操作传入参数为对象,判断对象中的字段是否有值,如果有就更新,如果没有就不更新
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件
- ASP中巧用Split()函数生成SQL查询语句的实例
- 动态生成SQL查询条件定制表单及语句的脚本
- XsqlFilterResult----动态生成sql语句的类,过滤一些为空的查询条件 .
- Jfinal适用于条件查询的动态SQL语句生成工具
- Access和sql查询语句的不同;Delphi中的双引号是没有的。
- 查询某个字段没有值的所有记录的SQL语句怎么写?(asp)
- linQ to sql 查询生成的sql语句
- TP 查询时候标题带有&的字符,查询没有结果!打出SQL语句去数据库查,返回有结果!
- 查询当前数据库中所有有默认值的字段,并生成添加默认值的SQL语句
- hql语句,封装后的hql语句在分开查询or语句要加上括号
- 自动生成SQL查询、删除、更新、插入语句
- 多项查询条件组合下的SQL语句生成
- Java生成 sql查询语句 通用方法(带排序/分页)(未测试)
- 【转】ibatis.net中的单个参数查询、多个参数查询和实体类查询以及动态SQL语句生成查询
- mybats 自动生成SQl 语句 修改 查询 添加