2011-12-21 55 views
1

我正在从Oracle向SQL Server迁移Hibernate上的某个项目(我不确定它是嵌入到JBoss5.1.0GA中的版本,看起来像3.x)。SQL谓词上的SQL Server + hibernate组合键失败

一个查询的HQL的样子:

... 
FROM k join k.defs kd 
    ... 
WHERE ... 
    kd not in (SELECT d.defs FROM d ...) 

在MSSQL此查询执行(和失败)为:

.... 
WHERE 
    ( 
    (kd.ITEM_ID, kd.DEF_ID) not in (
     SELECT 
      defs.ITEM_ID, defs.DEF_ID 

我​​实体有2场ITEM_ID和DEF_ID复合键。 SQL Server失败是因为与Oracle相比不支持复合IN谓词。

很明显,这是Hibernate产生的映射中的一个错误。我的问题是:如何配置/修补Hibernate以提供入伍样本的逐场比较?

回答

0

这应该完成同样的事情。左外连接包括k中的所有行和on中匹配的行中的行。 d不匹配时为空。我的语法可能会有一点 - 我不是在那里测试它,但我希望这可以让你开始。

FROM k join k.defs kd 
left outer join d.defs kd 
    ... 
WHERE ... 
    d is null 
+0

感谢您关注我的问题。 “NOT EXISTS”是替代'NOT IN'谓词的更优雅的方式。但是我将把它作为最后的解决方案 - 因为代码是遗留的,更改会导致副作用。所以在使用hibernate进行操作时出现问题 - 要进行修补(可能需要更高的版本或更改特定的类)。 – Dewfy 2011-12-22 07:47:24