2010-11-15 8 views
5

die folgende Einheit (einige Spalten aus dieser langen Definition der Kürze halber weggelassen) Gegeben:JPA: Join-Tabelle Syntax

@Table(name = "Products") 
public class Products implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "SKU") 
    private String sku; 
    @Basic(optional = false) 
    @Column(name = "ProductName") 
    private String productName; 

    private boolean allowPreOrder; 
    @ManyToMany(mappedBy = "productsCollection") 
    private Collection<Categories> categoriesCollection; 
    @JoinTable(name = "Products_CrossSell", joinColumns = { 
     @JoinColumn(name = "SKU", referencedColumnName = "SKU")}, inverseJoinColumns = { 
     @JoinColumn(name = "CrossSKU", referencedColumnName = "SKU")}) 
    @ManyToMany 
    private Collection<Products> productsCollection; 
    @ManyToMany(mappedBy = "productsCollection") 
    private Collection<Products> productsCollection1; 
    @JoinTable(name = "Products_Related", joinColumns = { 
     @JoinColumn(name = "SKU", referencedColumnName = "SKU")}, inverseJoinColumns = { 
     @JoinColumn(name = "RelatedSKU", referencedColumnName = "SKU")}) 
    @ManyToMany 
    private Collection<Products> productsCollection2; 
    @ManyToMany(mappedBy = "productsCollection2") 
    private Collection<Products> productsCollection3; 

Wie erhalte ich den Satz von verwandten Produkten für ein bestimmtes Produkt SKU?

Die products_related Tabelle sieht wie folgt aus:

alt text

Ich weiß, wie die Antwort mit SQL zu bekommen, aber ich bin neu in JPA so habe ich nicht ganz die API und Abfragesyntax noch grokked.

+0

+1 für mich stampfen - ich würde gerne die Lösung sehen. Ich habe meine vorherige Antwort gelöscht, weil sie falsch war. Wenn ich es herausgefunden habe, werde ich ein neues veröffentlichen oder wiederherstellen. Viel Glück :) – javamonkey79

Antwort

2

Es scheint mir, dass einige unnötige Sammlungen definiert sind. Wie dem auch sei:

@JoinTable(name = "Products_Related", joinColumns = { 
    @JoinColumn(name = "SKU", referencedColumnName = "SKU")}, inverseJoinColumns = { 
    @JoinColumn(name = "RelatedSKU", referencedColumnName = "SKU")}) 
@ManyToMany 
private Collection<Products> productsCollection2; 

Dieses Stück (es im Code vorhanden ist), sollten Sie die gewünschten Produkte. Benenne es einfach in relatedProducts und den entsprechenden Setter/Getter.

Update: Sie das Objekt, indem erhalten können:

Product p = entityManager.find(Product.class, yourProductId); 
p.getRelatedProducts(); 

Erhalt der Einheit-Manager auf Ihrem Setup ab, und zu einem besseren Ort zu suchen, wie es zu erhalten, ist ein Tutorial.

+0

Bitte lassen Sie mich wissen, wie der Anruf für einen bestimmten SKU-Wert aussehen würde? Wie würde ich getRelatedProducts() aufrufen (nachdem ich es von getProductsCollection2() umbenannt habe) und auf welches Objekt? – Sajee

+0

Danke! Du hast es leicht gemacht. :-) – Sajee

+0

@Bozho, wie würdest du etwas in einer Sammlung finden, ohne die Suche nach ID zu verwenden? – javamonkey79