簡體   English   中英

在JPA CriteriaQuery中使用@Embeddable實體

[英]Using an @Embeddable entity in a JPA CriteriaQuery

假設我有以下示例實體 - 一個是@Embeddable ,嵌入在另一個@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-plugin生成的元模型類僅包含employeeContactInfo變量,而不包括@AttributeOverride列。

現在假設我想這樣做:

選擇EMPLOYEE_IDEMPLOYEE_PHONE ,其中EMPLOYEE_ZIP_CODE等於“123456”

如何將其創建為CriteriaQuery

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 = em.getCriteriaBuilder();
CriteriaQuery<Object[]> qDef = cb.createQuery(Object[].class);
Root<EmployeeEntity> e = qDef.from(EmployeeEntity.class);
qDef.multiselect(
     e.get(EmployeeEntity_.employeeId),
     e.get(EmployeeEntity_.employeeContactInfo).get(ContactInfoEntity_.phone));
qDef.where(
     cb.equal(
        e.get(EmployeeEntity_.employeeContactInfo).get(ContactInfoEntity_.zipCode), 
        cb.literal("123456")));

List<Object[]> objects = em.createQuery(qDef).getResultList();
for (Object[] element : objects) {
    System.out.format("%d %s", element[0], element[1]);
}

根據您的偏好,您可能還希望將查詢結果視為:

  • 構造函數表達式

     public class EmployeeEntityResult { private int id; private String phone; public EmployeeEntityResult(int id, String phone) { this.id = id; this.phone = phone; } ... } 
     CriteriaQuery<EmployeeEntityResult> cq = cb.createQuery(EmployeeEntityResult.class); ... List<EmployeeEntityResult> result = em.createQuery(cq).getResultList(); for (EmployeeEntityResult element : result) { System.out.format("%d %s", element.getId(), element.getPhone()); } 
  • 元組

     CriteriaQuery<Tuple> cq = cb.createTupleQuery(); ... cq.select( cb.tuple( e.get(EmployeeEntity_.employeeId) .alias("id"), e.get(EmployeeEntity_.employeeContactInfo).get(ContactInfoEntity_.phone) .alias("phone"))); ... List<Tuple> tuple = em.createQuery(cq).getResultList(); for (Tuple element : tuple) { System.out.format("%d %s", element.get("id"), element.get("phone")); } 

JPQL查詢如下所示:

SELECT e.id, e.employeeContactInfo.phone
FROM EmployeeEntity e
WHERE e.employeeContactInfo.zipCode = '123456'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM