Java 在JPA标准查询中使用@Embeddeble实体
假设我有以下示例实体-一个是Java 在JPA标准查询中使用@Embeddeble实体,java,jpa,criteria,openjpa,criteria-api,Java,Jpa,Criteria,Openjpa,Criteria Api,假设我有以下示例实体-一个是@embeddeble,嵌入另一个@Entity: @Embeddable public class ContactInfoEntity { @Column private String phone; @Column private String zipCode; } @Entity @Table(name = "EMPLOYEE") public class EmployeeEntity { @Id @Colu
@embeddeble
,嵌入另一个@Entity
:
@Embeddable
public class ContactInfoEntity {
@Column
private String phone;
@Column
private String zipCode;
}
@Entity
@Table(name = "EMPLOYEE")
public class EmployeeEntity {
@Id
@Column(name = "EMPLOYEE_ID")
private Long employeeId;
@Embedded
@AttributeOverrides({
@AttributeOverride(name = "phone",
column = @Column(name = "EMPLOYEE_PHONE")),
@AttributeOverride(name = "zipCode",
column = @Column(name = "EMPLOYEE_ZIP_CODE"))
})
private ContactInfoEntity employeeContactInfo;
}
openjpa maven插件生成的元模型类只包含employeeContactInfo
变量,而不包含@AttributeOverride
列
现在假设我想这样做:
选择EMPLOYEE\u ID
和EMPLOYEE\u PHONE
,其中EMPLOYEE\u邮政编码等于“123456”
如何将其创建为标准查询
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<String> qDef = cb.createQuery(String.class);
Root<EmployeeEntity> e = qDef.from(EmployeeEntity.class);
qDef.select(e.get(EmployeeEntity_.employeeId),
e.get(????))
.where(cb.equal(e.get(????), "123456"));
return entityManager.createQuery(qDef).getResultList();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery qDef=cb.createQuery(String.class);
根e=qDef.from(EmployeeEntity.class);
qDef.select(e.get(EmployeeEntity_u2;employeeId),
e、 获得(??)
式中(cb.equal(e.get(??),“123456”);
返回entityManager.createQuery(qDef.getResultList();
示例方法可能如下所示:
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery qDef=cb.createQuery(对象[].class);
根e=qDef.from(EmployeeEntity.class);
qDef.multiselect(
e、 获取(EmployeeEntity_u2;employeeId),
e、 get(EmployeeEntity_u.employeeContactInfo).get(ContactInfoEntity_u.phone));
qDef.where(
cb.equal(
e、 get(EmployeeEntity_u.employeeContactInfo).get(ContactInfoEntity_u.zipCode),
cb.文字(“123456”);
List objects=em.createQuery(qDef).getResultList();
for(对象[]元素:对象){
System.out.format(“%d%s”,元素[0],元素[1]);
}
根据您的偏好,您可能还希望获得以下查询结果:
- 构造函数表达式
公共类EmployeeEntityResult{
私有int-id;
私人电话;
public EmployeeEntityResult(整数id,字符串电话){
this.id=id;
this.phone=电话;
}
...
}
CriteriaQuery cq=cb.createQuery(EmployeeEntityResult.class);
...
List result=em.createQuery(cq.getResultList();
for(EmployeeEntityResult元素:结果){
System.out.format(“%d%s”,element.getId(),element.getPhone());
}
- 元组
CriteriaQuery cq=cb.createTupleQuery();
...
选择(
元组(
e、 获取(EmployeeEntity_u2;.employeeId)
.别名(“id”),
e、 获取(EmployeeEntity.employeeContactInfo).get(ContactInfoEntity.phone)
.别名(“电话”);
...
List tuple=em.createQuery(cq.getResultList();
for(元组元素:元组){
System.out.format(“%d%s”,element.get(“id”),element.get(“phone”);
}
JPQL查询如下所示:
选择e.id,e.employeeContactInfo.phone
来自雇员实体e
其中e.employeeContactInfo.zipCode='123456'
ContactInfoEntity
和EmployeeEntity
有何关联?ResourceNodeEntity
是否应该替换为ContactInfoEntity
?@wypiperz假装您从未见过:)复制粘贴输入错误泄漏到示例代码中。固定的!