2016-04-05 12 views
0

Meine Einheit wie folgt aussieht:Auftrag in JPA Criteria API

class News { 
    private Long id; 
    private Author author; 
    private List<Tag> tagsList; 
    private String title; 
    private List<Comment> commentsList; 
    private Date modificationDate; 
} 

1) Ich möchte Ergebnisliste nach Grundstücksgröße und das Datum bestellen.

Der Teil meines Code:

cq.select(from).distinct(true) 
       .orderBy(cb.desc(from.get("commentsList.size")), cb.desc(from.get("modificationDate"))); 

Natürlich ist die ".size" es falsch. Wie kann ich das mithilfe der Kriterien-API tun?

2) Wie fügt man Tags von tagsList und Author in Kriterien hinzu?

+0

Größe einer Sammlung über CriteriaBuilder.size (...) erfolgt mit Das Argument lautet "from.get (" commentsList ")". Versuchte das? –

+0

Mögliches Duplikat von [JPA Criteria-API-Abfrage erstellen - Sortieren nach Anzahl der Elemente in der Sammlung] (http://stackoverflow.com/questions/21005794/building-jpa-criteria-api-query-sortting-by-number-of- Elemente in der Sammlung) – riskop

Antwort

1

Der Körper der Buildcriteria-Methode meine Probleme gelöst:

CriteriaQuery<News> cq = cb.createQuery(News.class); 
    Root<News> news = cq.from(News.class); 
    cq = cq.select(news).distinct(true); 

    if (sc != null) { 
     boolean authorExist = sc.getAuthorId() != null; 
     boolean tagsExist = sc.getTagIdsSet() != null && !sc.getTagIdsSet().isEmpty(); 

     if (authorExist && !tagsExist) { 
      cq.where(cb.in(news.get("author").get("id")).value(sc.getAuthorId())); 
     } else if (!authorExist && tagsExist) { 
      cq.where(cb.or(addTags(cb, news, sc))); 
     } else { 
      cq.where(cb.and(
        cb.in(news.get("author").get("id")).value(sc.getAuthorId()), 
        cb.or(addTags(cb, news, sc)) 
      )); 
     } 
    } 

    return cq.orderBy(cb.desc(cb.size(news.<Collection>get("commentsList"))), 
      cb.desc(news.get("modificationDate"))); 

Auch addTags Methode:

private static Predicate addTags(CriteriaBuilder cb, Root<News> news, SearchCriteria sc) { 
    In<Object> in = cb.in(news.get("tagsSet").get("id")); 

    for (Long id : sc.getTagIdsSet()) { 
     in = in.value(id); 
    } 

    return in; 
} 
2

Was ist damit?

.orderBy(cb.desc(cb.size(from.<Collection>get("commentsList"))), cb.desc(from.get("modificationDate"))); 
+0

Danke. Es hat einige der Probleme gelöst – Nox