当find(Object.Class,{CompositeKey})方法的键是复合键时,如何查找引用



当我们有复合键(两列或多列(作为第二个参数传递给JPA entityManager.find(Object.class,compositeKey(时,如何找到引用?

我的尝试-我创建了一个数组列表,并添加了组成compositeKey的值,然后将此列表传递给find方法。

例如:在我的情况下,useridprojectid

List<Integer> list = new ArrayList<Integer>();
list.add(userProjectDO.getUserid());
list.add(userProjectDO.getProjectid());
UserProject userProject = em.find(UserProject.class,list);

但是,即使表中存在userid和projectId,它也总是返回为null。有人遇到过类似的问题吗?解决方案

JPA的EntityManager#find不接受数组作为关键字,而是接受Object。既然您讨论的是复合键,那么您应该在一个单独的类中实现您的键,该类将通过列出所有单独的键属性来表示复合键。例如,您可以使用EmbeddedId来实现这一点。

例如:

您应该定义复合密钥类并使用@Embeddable:进行注释

public class UserProjectKey implements Serializable{
private String userId;
private String projectId;
//constructors, getters, setters
}

并将其用作实体中的CCD_ 3。

要按关键字搜索,可以执行以下操作:

UserProjectKey key = new UserProjectKey("userIdExample", "projectIdExample");
em.find(UserProject.class, key);

我找到了另一种方法,即编写namedQuery来搜索表。发布实现,以防它对任何人都有帮助。

final Query query = em.createNamedQuery("UserProject.findByAll");

UserProject实体类:

@Entity
@Table(name = "userproject", schema = "public")
@NamedQueries({ @NamedQuery(name = "UserProject.findByAll", query = "SELECT a FROM UserProject a where a.userid = :userid and a.projectid = :projectid"),
@NamedQuery(name = "UserProject.findByUserId", query = "SELECT a FROM UserProject a where a.userid = :userid"),
@NamedQuery(name = "UserProject.findById", query = "SELECT a FROM UserProject a where a.id = :id" )})
public class UserProject implements Serializable {
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy= GenerationType.IDENTITY)
@Column(name = "id")
private Integer id;
@Column(name = "userid")
private Integer userid;
@Column(name = "projectid")
private Integer projectid;
@Column(name = "created")
private Timestamp created;
@Column(name = "modified")
private Timestamp modified;
@Column(name = "modifiedbyid")
private Integer modifiedbyid;
@Column(name = "role")
private String role;
public Integer getId() {
return id;
}
public void setId(final Integer id) {
this.id = id;
}
public Integer getUserid() {
return userid;
}
public void setUserid(final Integer userid) {
this.userid = userid;
}

public void setProjectid(final Integer projectid) {
this.projectid = projectid;
}
public Timestamp getCreated() {
return created;
}
public void setCreated(final Timestamp created) {
this.created = created;
}
public Timestamp getModified() {
return modified;
}
public void setModified(final Timestamp modified) {
this.modified = modified;
}
public Integer getModifiedbyid() {
return modifiedbyid;
}
public void setModifiedbyid(final Integer modifiedbyid) {
this.modifiedbyid = modifiedbyid;
}
public String getRole() {
return role;
}
public void setRole(final String role) {
this.role = role;
}
}

最后将查询参数compositeKey值(userid,projectid(设置为:

final Query query = em.createNamedQuery("UserProject.findByAll");
query.setParameter("userid",userProjectDO.getUserid());
query.setParameter("projectid",userProjectDO.getProjectid());
List<UserProject> userProjectList = query.getResultList();

userProjectList将包含与compositeKey(userId,projectId(匹配的行

我看到这种方法的一个优点是,我可以根据需要/需求在实体类中编写N个命名查询。例如:如果我们需要处理从该表创建的视图。它可以很容易地实现,首先创建视图,然后编写另一个命名查询来处理它

最新更新