使用JPA条件在另一个表中使用搜索条件构建搜索查询

时间:2013-05-14 08:42:13

标签: jpa criteria-api

我需要根据StateTable表中与countryId匹配的给定国家名称(不是Country)来搜索来自like的状态使用JPA条件API的SQL运算符(countryIdStateTable中的外键,顾名思义)。

CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<StateTable> criteriaQuery = criteriaBuilder
                                          .createQuery(StateTable.class);
Root<StateTable>root=criteriaQuery.from(StateTable.class);

List<Predicate>predicates=new ArrayList<Predicate>();

predicates.add(criteriaBuilder
          .like(root.<String>get("countryName"), "%"+countryName+"%"));

criteriaQuery.where(predicates.toArray(new Predicate[0]));

entityManager.createQuery(criteriaQuery)
             .setFirstResult(first)
             .setMaxResults(pageSize)
             .getResultList();

如何修改以下声明以满足需要? (countryName表格中再次提供Country,此条件查询约为StateTable

predicates.add(criteriaBuilder
          .like(root.<String>get("countryName"), "%"+countryName+"%"));

使用JPQL很繁琐,​​因为需要为多个搜索条件构建查询。这只是一个演示/插图。


Country实体:

@Entity
public class Country implements Serializable {
    @Id
    private Long countryId;             //<----------------------
    @Column(name = "country_name")
    private String countryName;
    @Column(name = "country_code")
    private String countryCode;
    @OneToMany(mappedBy = "countryId", fetch = FetchType.LAZY)
    private Set<StateTable> stateTableSet;
}

StateTable实体:

@Entity
public class StateTable implements Serializable {
    @Id
    private Long stateId;
    @Column(name = "state_name")
    private String stateName;
    @JoinColumn(name = "country_id", referencedColumnName = "country_id")
    @ManyToOne(fetch = FetchType.LAZY)
    private Country countryId;                //<-------------------------------
}

2 个答案:

答案 0 :(得分:4)

您需要执行加入:

Join<StateTable, Country> country = root.join("countryId");
predicates.add(criteriaBuilder.like(country.<String>get("countryName"), "%"+countryName+"%"));

答案 1 :(得分:1)

您可以扩展您的条件定义(假设State实体中有一个属性国家/地区 - 换句话说,假设您在州表中将country_id作为外键):

Join<StateTable, Country> country = root.join("country", JoinType.LEFT);

// and change predicate with 
predicates.add(cb.like(country.<String>get("countryName"), "%"+countryName+"%"));

这应该完成所有工作。