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);
}
}