Java Hibernate,其中不适用于带有null成员的@Embedded
我有一个类Java Hibernate,其中不适用于带有null成员的@Embedded,java,spring,hibernate,Java,Spring,Hibernate,我有一个类发布,带有一个@嵌入式: public class Posting { @Embedded private BankDetails bankDetails; } public class BankDetails { private String bankCode; private String bankName; } 现在我想列出所有过账bankCode为123和bankName为null的 Query q = entityManager.cre
发布
,带有一个@嵌入式
:
public class Posting {
@Embedded
private BankDetails bankDetails;
}
public class BankDetails {
private String bankCode;
private String bankName;
}
现在我想列出所有过账bankCode
为123
和bankName
为null
的
Query q = entityManager.createQuery("SELECT o from Posting o WHERE bankDetails=?");
q.setParameter(1, new BankDetails("123", null));
但是我没有得到任何结果
为什么?
以下是Hibernate执行的sql查询:
select posting0_.bank_code as bank_cod6_42_, posting0_.bank_name as bank_nam7_42_
from posting posting0_
where (posting0_.bank_code, posting0_.bank_name)=('123', null)
(顺便说一句,这种括号语法称为行值构造函数。)
这显然不起作用,因为is将null
与=
进行比较
这是虫子吗?如果是,哪个组件生成SQL语句?(Hibernate?mysql连接器?)
有什么解决办法吗
环境:Win10上的MySQL Server 5.7、Spring 4.0.3、Hibernate 4.3.11、MySQL connector 5.1.30是的,有一个解决方法,但它要求您对查询更加详细
entityManager.createQuery( "SELECT o FROM Posting o WHERE " +
" o.bankDetails.bankCode = ? " +
" AND o.bankDetails.bankName IS NULL" );
entityManager.setParameter( 1, "123" );
老实说,我还没有见过使用这样的元组值生成的查询,但我过去的大部分经验都是使用不支持这种语法的SQL Server。如果您认为这是一个bug,请随时打开一个问题。这是Hibernate 4和5中的一个bug
它应该在Hibernate 6中修复:
请参阅@Naros answer以了解解决方法。在SQL Server中,语法可能是('123',null)
中的where(posting0.bank\u代码,posting0.bank\u名称)
但我无法验证。我无法对MSSQLSQL2012+发表评论,但我知道MSSQLSQL2008及之前版本的语法无效。