JPA中的复合主键
EmbeddedId或IdClass注释用于表示复合主键。 如果没有(EmbeddedId或IdClass),如何使用复合主键 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么在复合主键的情况下如何使用EntityManager.find(实体类,对象主键)方法查找实体(多个主键)(因为没有IdClass或EmbeddedId) EclipseLink在find()操作中获取pk列表,但如果在示例中定义了复合pk键-JPA中的复合主键,jpa,persistence,eclipselink,composite-primary-key,Jpa,Persistence,Eclipselink,Composite Primary Key,EmbeddedId或IdClass注释用于表示复合主键。 如果没有(EmbeddedId或IdClass),如何使用复合主键 如果可以在没有(EmbeddedId或IdClass)的情况下使用复合主键,那么在复合主键的情况下如何使用EntityManager.find(实体类,对象主键)方法查找实体(多个主键)(因为没有IdClass或EmbeddedId) EclipseLink在find()操作中获取pk列表,但如果在示例中定义了复合pk键- Entity Person {
Entity Person {
@Id
String username;
@Id
String emailId;
@Basic
String firstName;
@Basic
String lastName;
}
List list = new ArrayList();
list.add(${username}); //Run time value
list.add(${emailId}); //Run time value
然后entitymanager.find(list)将接受这些参数,对吗
如果我假设正确,那么EnitityManager.find()操作将如何知道列表第一个参数是username或emailId pk值(表示复合pk字段值的序列)您应该能够在EclipseLink中使用带有find()操作的列表。让我谈谈我的想法
find
<T> T find(java.lang.Class<T> entityClass,
java.lang.Object primaryKey)
因为您有一个组合键,所以应该有一个像这样的IdClass或EmbeddedId
public class PersonKey implements Serializable{
String username;
String emailId;
public PersonKey(String username, String emailId){
//Add lines for correct constructor
}
//Override hascode and equals
}
PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);
然后,您可以根据该键查找对象。
查找(Person.class、personKey)
你的钥匙应该是这样的
public class PersonKey implements Serializable{
String username;
String emailId;
public PersonKey(String username, String emailId){
//Add lines for correct constructor
}
//Override hascode and equals
}
PersonKey personKey = new PersonKey(1,1);
Person p = find(Person.class, personKey);
在纯JPA中查找不接受列表,只接受并返回一个托管对象。如果要使用find检索多个对象,则应调用该方法N次,并传递要查找的键
如果使用find传递列表,您将看到如下内容
org.springframework.dao.InvalidDataAccessApiUsageException:
为类domain.model.Person提供的id类型错误。预期:
类domain.key.PersonKey,得到类java.util.ArrayList;嵌套
异常为java.lang.IllegalArgumentException:提供的
上课的类型不对
com.staples.sa.pricemart.domain.model.ItemFileEntity。预期:班级
com.staples.sa.pricemart.domain.key.ItemFileKey,获得类
java.util.ArrayList
eclipseLink似乎已经发现您可以做到这一点,但为了使您的应用程序更具可移植性,请尝试使用JPA中描述的find。在纯JPA中,您不能。它需要一个用于查找API的pk类。但是Eclipselink不需要pk类,如果您不使用JPA,可以将一组值作为pk。有没有办法只传递一个ID元素?基本上,我想查询所有拥有相同用户名的人。你可以使用createQuery或createNativeQuery,find方法不会像你想的那样工作,因为你需要传递完整的组合键。