在hibernate查询中缺少具有空值的行

Ida*_*dan 11 java hibernate

我有两个带有外键引用的表:

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 |
+---------+------+-----+
Run Code Online (Sandbox Code Playgroud)

问题是休眠返回我的缺少通讯对象locationSET<location> 不存在的所有行FROM TO(如在表位置的最后一行COMM_ID = 1)丢失.

否则(如果只有一个FROMTO那个)行返回...为什么?

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;
 }
Run Code Online (Sandbox Code Playgroud)

Location 类:

@Embeddable
class Location implements java.io.Serializable {

    private BigDecimal fromLocationId;
    private BigDecimal toLocationId;

    public Location() {
    }

    public Location(BigDecimal fromLocationId, BigDecimal toLocationId) {
        this.fromLocationId = fromLocationId;
        this.toLocationId = toLocationId;
    }

    @Column(name="FROM", nullable=true, precision=22, scale=0)
    public BigDecimal getFromLocationId() {
        return this.fromLocationId;
    }

    public void setFromLocationId(BigDecimal fromLocationId) {
        this.fromLocationId = fromLocationId;
    }

    @Column(name="TO", nullable=true, precision=22, scale=0)
    public BigDecimal getToLocationId() {
        return this.toLocationId;
    }

    public void setToLocationId(BigDecimal toLocationId) {
        this.toLocationId = toLocationId;
    }

    @Override
    public int hashCode() {
        return com.google.common.base.Objects.hashCode(fromLocationId, toLocationId);
    }

    @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.fromLocationId, other.fromLocationId) && com.google.common.base.Objects.equal(this.toLocationId, other.toLocationId);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用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
Run Code Online (Sandbox Code Playgroud)

我在我的数据库中检查了它,它返回了正确的结果.

kuc*_*ang 2

事实上,输出并没有什么问题。我想你只是混淆了embeddableentity。因为,据我所知。embeddable如果有很多实体使用相同的字段,则仅使用该类来使实体的开发变得更加容易。

据我所知,hashcodeequals方法确实将所有这六个记录视为不同的记录。所以,我认为你想要的是将课程变成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);
}
}
Run Code Online (Sandbox Code Playgroud)

或者,当然您可以使 get 方法返回 a List,然后在该行丢失fromto值缺失时删除该行。