【问题标题】:Hibernate is not generating proper sql query for Hibernate Named Query in ( hbm file ) mapping fileHibernate 没有为(hbm 文件)映射文件中的 Hibernate 命名查询生成正确的 sql 查询
【发布时间】:2016-04-18 12:25:40
【问题描述】:

我在 hbm 文件中定义了一个休眠命名查询。

<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> 

通过hibernate 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是从需要的地方删除(实际逻辑改变,这里生成的查询没有(and (addressboo0_.LOCK_OWNER is null or (addressboo0_.LOCK_OWNER is not null) and sysdate-addressboo0_.LOCK_LEASE_DATE&gt;?)但是需要的查询是and (addressBook.lockOwner is null or (addressBook.lockOwner is not null and (sysdate - addressBook.lockLeaseDate) &gt; ?))有没有其他办法这个?

标签: hibernate orm hql hibernate-mapping


【解决方案1】:

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

更新

(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)

【讨论】:

  • 感谢您的快速建议,但是如果您看到转义 ( 的查询正在更改实际逻辑,这是生成的逻辑 ` (addressboo0_.LOCK_OWNER 不为 null) 和 sysdate-addressboo0_.LOCK_LEASE_DATE>) ` 但实际上需要的是 (addressboo0_.LOCK_OWNER 为 null 或 (addressboo0_.LOCK_OWNER 不为 null and (sysdate-addressboo0_.LOCK_LEASE_DATE)>?) )
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 2019-09-11
  • 2014-05-26
  • 2017-12-25
  • 1970-01-01
相关资源
最近更新 更多