Java hibernate查询中缺少值为空的行
我有两个带有外键引用的表:Java hibernate查询中缺少值为空的行,java,hibernate,Java,Hibernate,我有两个带有外键引用的表: Comm TABLE: +----+------------+ | ID | NAME | +----+------------+ | 1 | comm name1 | | 2 | comm name2 | | 3 | comm name3 | +----+------------+ LOCATION TABLE: - COMM_ID FK to Comm --> id +---------+------+-----+ | COMM_I
Comm TABLE:
+----+------------+
| ID | NAME |
+----+------------+
| 1 | comm name1 |
| 2 | comm name2 |
| 3 | comm name3 |
+----+------------+
LOCATION TABLE: - COMM_ID FK to Comm --> id
+---------+------+-----+
| COMM_ID | FORM | TO |
+---------+------+-----+
| 1 | 720 | 721 |
| 1 | 725 | |
| 1 | | 766 |
| 1 | | |
| 2 | 766 | 225 |
| 3 | 766 | 222 |
+---------+------+-----+
问题是Hibernate返回我的comm对象
在集合中缺少位置
缺少没有从
和到
的的所有行(如表位置中COMM_ID=1的最后一行)
否则(如果只有FROM
或TO
中的一个)将返回该行。。。
为什么?
Comm
对象:
@ElementCollection
@CollectionTable(name="LOCATION",joinColumns=@JoinColumn(name="COMM_ID"))
public Set<LOCATION> getLocations(){
return locations;
}
public void setLocations(Set<LOCATION> locations){
this.locations=locations;
}
我正在使用Hibernate-4.3.6
日志:
org.hibernate.SQL -
select
locations0_.COMM_ID as COMM_ID1_2_0_,
locations0_.FROM as FROM2_8_0_,
locations0_.TO as TO4_8_0_
from
LOCATION locations0_
where
locations0_.COMM_ID=1
我在数据库中检查了它,它返回了正确的结果。实际上,输出没有问题。我想您只是混淆了可嵌入
和实体
。因为,据我所知。如果有许多实体使用相同的字段,则只可将Embeddeble
类用于使实体的开发更加容易
据我所见,hashcode
和equals
方法确实将这六条记录视为一条不同的记录。因此,我认为您想要的是将Location
类变成这样
@Entity
class Location implements java.io.Serializable {
private Long commId;
private BigDecimal fromLocationId;
private BigDecimal toLocationId;
// all the setter getter here
@Override
public int hashCode() {
return com.google.common.base.Objects.hashCode(commId);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final LOCATION other = (LOCATION) obj;
return com.google.common.base.Objects.equal(this.commId, other.commId);
}
}
当然,您也可以使用get方法返回一个列表
,如果该行从
或到
值中缺少,则可以删除该行。可嵌入对象的数据包含在其父表的几列中。由于没有单个字段值,因此无法知道父级对可嵌入对象的引用是否为null。我们可以假设,如果Embeddeble的每个字段值都为null,那么引用应该为null,但是没有办法用所有null值表示一个Embeddeble。JPA不允许Embeddebles为null,但一些JPA提供程序可能支持这一点
Hibernate:加载实体时,如果可嵌入实体中的所有列都为null,则将嵌入引用设置为null
更多信息
因此,当您保存可为空的可嵌入值时,hibernate允许保存,但在获取hibernate时,放弃可为空的行。我是否遗漏了什么?您的数据显示“从”和“到”是字符串,但您的映射说明它们应该是数字???请发布整个位置类。由于您使用的是Set
,因此必须正确覆盖equals
和hashCode
方法。public boolean equals(com.google.common.base.Object obj)
这看起来不对。请把全班发出去。并检查是否发布了真实代码。两件事:第一,“comm_id”变量为什么丢失?你不需要吗?如果该表的两行具有不同的“comm_id”,但都没有“from”或“to”,那么它们仍然与您的程序“逻辑”相同,这可能会有问题。第二:我假设com.google.common.base.Objects.equal(this.fromLocationId,other.fromLocationId)
在这里是危险的。因为它应该调用BigDecimal#equals
,而这个实现对“equal”实例的限制非常严格。要检查这是否是问题所在,请测试或使用List
而不是Set
我更改了“equal”方法,但没有帮助,总之我在“equal”方法中添加了断点,没有命中。(当location返回时,它将命中此断点)
@Entity
class Location implements java.io.Serializable {
private Long commId;
private BigDecimal fromLocationId;
private BigDecimal toLocationId;
// all the setter getter here
@Override
public int hashCode() {
return com.google.common.base.Objects.hashCode(commId);
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
final LOCATION other = (LOCATION) obj;
return com.google.common.base.Objects.equal(this.commId, other.commId);
}
}