JPA 2.5 CriteriaQuery条件子实体

时间:2014-09-07 12:56:44

标签: java jpa eclipselink criteria

我有一个实体

@javax.persistence.Table(name = "CONTACT")
public class ContactEntity {
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "contact")
    private List<PhoneEntity> phones;

    ...
}

@Table(name = "CONTACT_PHONE")
@Entity
public class PhoneEntity {
    @Column(name = "DEVICE_TYPE")
    private String deviceType;

    ...
}

当我使用CriteriaBuilder选择我的实体时,我希望通过某些特定字段过滤Contact拥有的手机。例如,通过deviceType。是否可以使用Criteria API?

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<ContactEntity> criteriaQuery = criteriaBuilder.createQuery(ContactEntity.class);
Root<ContactEntity> root = criteriaQuery.from(ContactEntity.class);
List<ContactEntity> contactSnapshotEntities =
            entityManager.createQuery(criteriaQuery).getResultList();

1 个答案:

答案 0 :(得分:0)

如果您向联系人实体询问其电话,您将始终获得此联系人实体的所有电话,无论您获得联系人实体的方式如何。这是您班级的合同:联系人有很多电话,可以使用getPhones()方法。

如果您想要一个联系人实体的手机的子集,那么您不应该获得联系人并获取其手机。您应该使用返回另一个集合的查询,该集合仅包含符合条件的电话。例如:

select p from Phone p where p.contact = :contact and p.deviceType = :deviceType

(或标准API混淆的相同查询)。