2016-07-08 14 views
1

Hilf mir plz mit einem Moment. Ich habe ungefähr 10 Artikel bereits gelesen, aber verstehe nicht, verbinden Sie Moment. Ich habe 2 Tabellen:JPA Kriterien API beitreten

public class News implements Serializable { 
@Id 
@GeneratedValue (generator = "increment") 
@GenericGenerator (name = "increment", strategy = "increment") 
private int id; 
@Column 
private String name; 
@Column 
private Date created; 
@Column 
private String data; 
@ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
@JoinColumn (name = "category_id") 
private NewsCategoryDict category; 
// getters, setters 
} 

und

public class NewsCategoryDict implements Serializable { 
@Id 
@GeneratedValue (generator = "increment") 
@GenericGenerator (name = "increment", strategy = "increment") 
private int id; 
@Column 
private String name; 
@OneToMany (mappedBy = "category", cascade = CascadeType.ALL) 
private List<News> news = new ArrayList<>(); 
} 

Ich möchte eine Abfrage funktioniert wie

SELECT * FROM news, categorynews WHERE news.category_id = categorynews.id; 

Und dann mit

<div id="list_news"> 
     <c:forEach items="${news}" var="news"> 
      <h5>${news.id} : ${news.name} - ${news.created} ; ${news.data} (${news.category.name})</h5> 
     </c:forEach> 
    </div> 

Und ich das Ergebnis in jsp erhalten Ich kann dieses JOIN mit der Kriterien-API nicht verstehen. Kannst du mir helfen ? Versuchen Sie, diese Schnipsel zu verwenden, aber einen Fehler erhalten

public List<News> getAll() { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<News> cq = cb.createQuery(News.class); 
    Root<News> rootFromNews = cq.from(News.class); 
    Join<NewsCategoryDict, News> join = rootFromNews.join("category"); 
    cq.select(join); 

    return em.createQuery(cq).getResultList(); 
} 

PropertyNotFoundException: Anwesen ‚erstellt‘ nicht auf Typ ru.r1k0.spring.model.NewsCategoryDict gefunden

+0

Sie schreiben: * Ich möchte eine Abfrage funktioniert wie: * 'SELECT * FROM Nachrichten, categorynews'. Diese Abfrage gibt alle Daten in beiden Tabellen zurück. Aber Sie schreiben in den Kommentar zu der Antwort unten: * aber ich will Liste *. Also was willst du? Wenn Sie eine Liste von 'News' wünschen, warum brauchen Sie einen * JOIN *? – ujulu

Antwort

1

Angenommen, Sie eine Instanz von News zu einer Instanz von NewsCategoryDict zugeordnet zurückkehren möchten, Ihren Kriterien Abfrage sollte wie folgt aussehen:

public List<News> getAll() { 
    CriteriaBuilder cb = em.getCriteriaBuilder(); 
    CriteriaQuery<News> cq = cb.createQuery(News.class); 
    Root<News> rootFromNews = cq.from(News.class); 
    Join<News, NewsCategoryDict> join = rootFromNews.join("category"); // #1 
    cq.select(rootFromNews); // #2 

    return em.createQuery(cq).getResultList(); 
} 

Die modifizierten Linien mit #1 gekennzeichnet sind und #2 Kommentare.

Die Abfrage sollte alle News zurückgeben, die eine übereinstimmende NewsCategoryDict haben; aber News Datensätze, die keinem NewsCategoryDict Datensatz zugeordnet sind, werden nicht zurückgegeben.

+0

Jede Nachricht hat immer category_id von NewsCategoryDict. Also selbst wenn es wahr ist - ich versuche deine Entscheidung, aber habe eine NullPointerException mit, ich denke, dieses Snippet: $ {news.category.name}.Wie kann ich in jsp auf dieses Feld zugreifen? – R1K0

+0

Sie erhalten NPE, weil Sie 'Kategorie ** ** träge ** laden. Ändern Sie die Annotation "@ ManyToOne" in "@ManyToOne (cascade = CascadeType.ALL, fetch = FetchType.EAGER)" oder entfernen Sie die Option "fetch", da eager der Standardwert ist. – ujulu

+0

Vielen Dank. Jetzt funktioniert es ! – R1K0

0

Ihr Fehler hat nichts zu mach mit dem Join! Was tatsächlich passiert, ist, dass Sie im JSP-Fragment versuchen, auf $ {news.created} zugreifen, die nicht in der NewsCategoryDict. Ich glaube, der Fehler liegt im JSP-Fragment, nicht in der Criteria-Abfrage.

Die Art, wie ich es verstehe, ist, dass Sie das News-Objekt auflisten möchten, aber in der Abfrage wählen Sie die NewsCategoryDict und das ist, warum Sie am Ende fehlen Attribut, da die NewsCategoryDict nicht enthält $ { news.created}

+0

Ja. Wenn ich versuche, Join zu verwenden, gibt em.createQuery (cq) .getResultList() die Liste zurück, aber ich möchte die Liste R1K0

+0

Zwei Fragen, müssen Sie wirklich beitreten? Sie brauchen nur die Nachrichten, dann wahrscheinlich nicht. Ich bedauere jedoch, dass Sie es in einem anderen Teil der JSP-Seite benötigen. In diesem Fall müssen Sie den Stamm und nicht den Join wie folgt auswählen: cq.select (rootFromNews); Dadurch werden Sie die Nachrichten auswählen. –

+0

Ja, ich brauche wirklich einen Beitritt 'cos News hat eine category_id und NewsCategoryDict hat Name mit dieser ID verbunden. Ich möchte News-Objekt mit gefülltem Kategorieattribut einen Namen der Kategorie mit einer einzigen Entität erhalten, – R1K0

Verwandte Themen