Hibernate不会为(hbm文件)映射文件中的Hibernate命名查询生成正确的sql查询

问题描述 投票:0回答:1

我在hbm文件中定义了一个名为hibernate的查询。

<query name="AddressBook.find_by_user_id_and_type_lease_time">
    <![CDATA[ FROM AddressBook addressBook 
        WHERE addressBook.mightyUser.userId = ? 
        and addressBook.typeId = ? 
        and (addressBook.lockOwner is null
        or (addressBook.lockOwner is not null 
        and (sysdate - addressBook.lockLeaseDate) > ?))]]>
</query> 

通过休眠查询界面执行此查询后,发现生成的查询不正确。在这里'('被忽略/从查询中切掉。

 2016-01-13 12:26:44.327 475eb4d0 D 00000000000000000000000000000000    02a5:select addressboo0_.ADDRESS_BOOK_ID as ADDRESS1_37_, addressboo0_.VERSION as VERSION37_, addressboo0_.ADDRESS_BOOK_NAME as ADDRESS3_37_, addressboo0_.UPDATED_TIME as UPDATED4_37_, addressboo0_.CREATED_DT as CREATED5_37_, addressboo0_.TYPE_ID as TYPE6_37_, addressboo0_.LOCK_OWNER as LOCK7_37_, addressboo0_.DEDUPE_DATE as DEDUPE8_37_, addressboo0_.LOCK_LEASE_DATE as LOCK9_37_, addressboo0_.ACCOUNT_NAME as ACCOUNT10_37_, addressboo0_.USER_ID as USER11_37_ from R4GDEV02_MBW.ADDRESSBOOK addressboo0_ where addressboo0_.USER_ID=? and addressboo0_.TYPE_ID=? and (addressboo0_.LOCK_OWNER is null or 
***(addressboo0_.LOCK_OWNER is not null) and sysdate-addressboo0_.LOCK_LEASE_DATE>?)***

请提出建议/建议

hibernate orm hql hibernate-mapping
1个回答
1
投票

SQL查询是正确的,因为and的优先级高于or。所以你不需要括号(addressBook.lockOwner is not null and (sysdate - addressBook.lockLeaseDate) > ?)

更新

(addressBook.lockOwner is null or 
    (addressBook.lockOwner is not null and (sysdate - addressBook.lockLeaseDate) > ?))

手段

(A + (B * C))

(addressBook.lockOwner is null or 
    (addressBook.lockOwner is not null) and sysdate - addressBook.lockLeaseDate > ?)

手段

(A + B * C)

相同

(A + (B * C)) = (A + B * C)
© www.soinside.com 2019 - 2024. All rights reserved.