如何在JPA中通过其复合密钥ID找到对象



我试图从我的DB表Real_States中找到一个对象,如下所示:

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

我想通过它的复合主键(address,block,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类的声明如下:

@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和Java。

正如文档中所述:

主键类必须定义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);
}
}

最新更新