繁体   English   中英

如何通过复合密钥 ID 在 JPA 中找到 object

[英]How can I find an object in JPA by its Composited Key ID

我试图从我的数据库表 Real_States 中找到一个 object,如下所示:

CREATE TABLE REAL_STATES (
address VARCHAR(30) NOT NULL,
admin_id VARCHAR(15) NOT NULL,
resident_id VARCHAR(15),
real_state_type_id INT(6) NOT NULL,
block VARCHAR(3) NOT NULL,
internal_id INT(5) NOT NULL,
PRIMARY KEY (address, block, internal_id),
FOREIGN KEY (real_state_type_id) REFERENCES REAL_STATE_TYPES (real_state_type_id),
FOREIGN KEY (admin_id) REFERENCES ADMINS (admin_id),
FOREIGN KEY (resident_id) REFERENCES RESIDENTS (resident_id)
);

我想通过它的复合主键(地址、块、internal_id)获取该表的一行,所有这些都来自我的 EntityManager。 这是这样的:

public RealState findRealState(RealStateID realStateId) {
    RealState realState = em.find(RealState.class, realStateId); // first Try, which failed
    List<RealState> realStates = em.createQuery("FROM RealState rs WHERE  rs.realStateID.address like :" + realStateId.getAddress()).getResultList(); // second try which failed too
    for (RealState realState2 : realStates) {
        System.out.println(realState2.toString());
    }
    if (realState == null) {
        throw new EntityNotFoundException("Can't find realState for ID " + realStateId.toString());
    }
    return realState;
}

RealStateID Class 声明如下:

@Embeddable
public class RealStateID  implements Serializable{
    private static final long serialVersionUID = 6485406412363395170L;
    @Column(name = "address")
    private String address;
    @Column(name = "block")
    private String block;
    @Column(name = "internal_id")
    private int internal_id;
    //getters..setters..

但是我只是错误地出错,IDK我做错了什么,我想弄清楚。 我没有使用 Spring,只是 JPA Hibernate 和 ZD52387880E1EA22817A72D375Z23。

正如文档中所述:

主键 class 必须定义equalshashCode方法,与主键映射到的基础数据库类型的相等性一致。

假设它,方法:

RealState realState = em.find(RealState.class, new RealStateID(...));

应该按预期工作。

编辑您的RealStateID应如下所示:

@Embeddable
public class RealStateID  implements Serializable{
    private static final long serialVersionUID = 6485406412363395170L;

    @Column(name = "address")
    private String address;

    @Column(name = "block")
    private String block;

    @Column(name = "internal_id")
    private int internal_id;`
    
    // getters, setters

    @Override
    public boolean equals(Object o) {
        if ( this == o ) return true;
        if ( o == null || getClass() != o.getClass() ) return false;

        RealStateID pk = (RealStateID) o;
        return Objects.equals(address, pk.address) &&
                Objects.equals(block, pk.block) &&
                Objects.equals(internal_id, pk.internal_id);
    }

    @Override
    public int hashCode() {
        return Objects.hash(address, block, internal_id);
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM