我有一个遗留数据库(实际上是Cobol文件),我使用Hibernate/JPA的专有JDBC驱动程序访问.
实体有一个包含2列的复合主键:CODE和SITE.
在传统的数据存在针对相同的记录CODE是可以有一个特定的值SITE,或者可以有与空记录SITE柱代表"所有网站".这个文件的理论是,如果你找不到CODE特定的,SITE那么你在SITE('catch-all')中查找带有NULL的记录.
我不能改变这个'表'的结构,因为它将涉及重写我们不想做的传统Cobol系统的大部分.我也无法创建数据视图.
现在,当我em.find使用包含特定code和null 的主复合键类时site,Hibernate正确地在列中找到具有NULL值的匹配记录 - 一切都好!
但是,如果我尝试使用em.createQuery类似于以下内容进行查询:
SELECT x FROM TareWeight x WHERE x.pk.code = 'LC2'
Run Code Online (Sandbox Code Playgroud)
如果有2条记录,它会在结果列表中为SITE列中的NULL返回一个空对象.
如果我使用Hibernate用于此查询的SQL,那么'database'将返回两条记录,一条记录具有NULL站点,另一条记录具有特定站点.似乎当Hibernate从这些结果加载实体时,它将它映射到空Entity对象.
所以要么Hibernate支持它,要么它不支持它.为什么em.find工作而不是em.createQuery?
我知道这个问题很相似,但答案似乎表明这是不可能的.但显然Hibernate可以正确地进行查找,那么为什么查询不起作用呢?
编辑:好的,所以我NullableStringType在这个Hibernate JIRA问题上找到了一个类定义,并将它添加到我的项目中.
如果我使用这个类型类在PK @Type的site列上添加一个定义,那么我可以成功地从SELECT查询中获取非空实体,该site字段包含我定义的任何String文本作为其表示null.
但是,它仍然表现不同.所述find返回一个实体与所述site字段包含null,但该查询返回的实体与site包含"南"(的默认表示字段null …
我正在使用Hibernate的JPA impl对某些表进行建模。我在映射表时遇到了麻烦:
我试图破解它并将索引定义为复合ID,但是由于某些列可为空,因此无法正常工作。JPA / Hibernate有可能吗?
谢谢