我正在尝试使用 JPA 2.0 Criteria API(使用 Hibernate 实现)来选择那些拥有由一组模式定义的配件的汽车。
请看看我的代码,我想你会明白我想要做什么。
实体:
@Entity
@Table(name = "CARS")
public class Car implements Serializable {
// .. Other fields
// {{ accessories
@ElementCollection(fetch = FetchType.LAZY)
@CollectionTable(name = "CARS_ACCESSORIES", joinColumns = @JoinColumn(name = "CARID"))
@Column(name = "ACCESSORY", length = 25)
private Set<String> accessories;
Car 类的存储库/服务方法,用于查找拥有具有某种模式的配件的所有汽车:
public List<Car> findByAccessoryCriteria(Set<String> accessoriesCriteria) {
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Car> cq = cb.createQuery(Car.class);
Root<Car> car = cq.from(Car.class);
List<Predicate> criteria = new ArrayList<Predicate>();
if(accessoriesCriteria != null) {
for(String accessory : accessoriesCriteria) {
if(accessory.contains("%") {
// TODO: Select all Cars that contains an accessory which match
// accessory pattern.
} else {
// TODO: Select all Cars that contains an accessory which is
// equal to accessory pattern.
}
// TODO: Note that if a Car NOT owns an accessory which match or is equal to a
// the pattern, the Car shall NOT be selected.
}
}
cq.select(car).where(criteria.toArray(new Predicate[criteria.size()]));
TypedQuery<Car> query = em.createQuery(cq);
List <Car> cars= query.getResultList();
return cars;
}
因此,如果汽车 A 拥有以下配件:“配件 XYZ”、“配件 AAA”,而汽车 B 拥有以下“配件 XYZ”,且条件为 Set =“配件%”,则汽车 A 和汽车应选择 B,但如果条件设置为“Accessory XYZ”、“Accessory AAA”,则仅选择 A 车。
你能帮我完成这个选择语句吗?请注意,我被迫使用标准 API 和 Hibernate 框架。
致以诚挚的问候
最佳答案
强制使用 Hibernate 与此无关,因为这是 JPA 标准查询。无论如何...
if (accessoriesCriteria != null) {
// we have accessory restrictions...
// now apply each incoming restriction
for (String accessoryCriteria : accessoriesCriteria) {
// define a path to the accessories association that we can use to apply
// the restrictions
final Join<Car,String> accessoryJoin = (Join<Car,String>) car.join( "accessories" );
// or, if using generated metamodel:
// Join<Car,String> accessoryJoin = car.join( Car_.accessories );
if (accessoryCriteria.contains("%") {
criteria.add( cb.like( accessoryJoin, accessoryCriteria ) );
}
else {
criteria.add( cb.equal( accessoryJoin, accessoryCriteria ) );
}
}
}
关于java - 使用 JPA 2.0 Criteria API 选择定义集的超集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448777/