0

УчитываяКак получить запрос interesect с помощью CritieraQuery?

@Entity 
public class Document { 

    @Id 
    @Column(name = "DOCUMENT_ID") 
    private Long id; 

    @ElementCollection 
    @CollectionTable(
     name="TAG", 
     [email protected](name="DOCUMENT_ID") 
    ) 
    @Column(name="TAG") 
    private Set<String> tags;  
} 

найти все документы, помеченные определенной коллекции тегов. По существу, эквивалент EclipseLink:

SELECT d FROM Document d WHERE :tag1 MEMBER OF d.tags 
INTERSECT 
SELECT d FROM Document d WHERE :tag2 MEMBER OF d.tags 
... 
SELECT d FROM Document d WHERE :tagn MEMBER OF d.tags 

, но с использованием JPA CritieraQuery.

ответ

0

Используйте агрегатный запрос с имеющим п для выбора строки, совпавшие все необходимые теги:

CriteriaBuilder cb = entityManager().getCriteriaBuilder(); 
    CriteriaQuery<Long> q = cb.createQuery(Long.class); 
    Root<Document> from = q.from(Document.class); 
    List<Predicate> predicates = new ArrayList<Predicate>(); 
    Expression<Long> id = from.get("id"); 

    Expression<Collection<String>> documentTags = from.get("tags"); 
    for (String tag : searchedTags) { 
     Expression<String> param = cb.literal(tag); 
     Predicate predicate = cb.isMember(param, documentTags); 
     predicates.add(predicate); 
    } 

    q.multiselect(id).where(
      cb.or(predicates.toArray(new Predicate[0]))); 
    q.distinct(true); 
    q.groupBy(id); 

    q.having(cb.equal(cb.count(id), searchedTags.size())); 

    TypedQuery<Long> query = entityManager().createQuery(q); 

 Смежные вопросы

  • Нет связанных вопросов^_^