java - 使用 JPA 2.0 Criteria API 选择定义集的超集数据

标签 java hibernate jpa

我正在尝试使用 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/

相关文章:

java - 如何读取textView末尾的任意大数字?

java - 在 Eclipse 中注释/取消注释特定格式

Java hibernate声明连接有效

java - 为什么我们必须在 persistence.xml 中提供数据库凭据

unit-testing - 为什么使用内存数据库时此 NamedQuery 不起作用?

java - 使用输入字符串 "exit"在终端中退出程序

c# - 通过.net使用java web服务-数据不一致

java - Struts 2 Spring 3 集成,未找到操作类

java - 在 hibernate 中从 session.createQuery 获取超过 1 个对象

java - 如何将@JsonIdentityInfo与复合PK一起使用?