0

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 の両方がただし、基準が Set = "Accessory XYZ", "Accessory AAA" の場合、Car A のみが選択されます。

この select ステートメントを完成させるのを手伝ってくれませんか? 基準 API と Hibernate フレームワークを使用する必要があることに注意してください。

よろしくお願いします

4

1 に答える 1

2

これはJPA基準クエリであるため、Hibernateの使用を強制されることはここでは関係ありません。ともかく...

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 ) );
       }
   } 
}
于 2013-03-16T16:36:30.370 に答える