我需要根据StateTable
表中与countryId
匹配的给定国家名称(不是Country
)来搜索来自like
的状态使用JPA条件API的SQL运算符(countryId
是StateTable
中的外键,顾名思义)。
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; //<-------------------------------
}
答案 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+"%"));
这应该完成所有工作。