2012-11-16 6 views
8

Ich habe zwei Klassen, Benutzer und Auto. Beide haben ManyToMany Mapping aufeinander.Ebean ManyToMany Abfrage

Benutzer:

@Entity 
public class User extends Model { 

    private int year; 

    @ManyToMany(cascade=CascadeType.ALL) 
    private List<Car> cars; 
} 

Auto:

@Entity 
public class Car extends Model { 
    @ManyToMany(mappedBy = "cars", cascade=CascadeType.ALL) 
    private List<User> users; 
} 

ebean Verwendung, ich möchte nur die Autos aus dem Jahr 1999 abzufragen, die in ihrer Liste geben Benutzer haben. Ich möchte nicht über die Autoliste des Benutzers in Java-Code iterieren.

Ich habe keine Dokumentation gefunden, wie viele-zu-viele-Abfragen aussehen sollten. Also würde ich etwas in der Art:

public List<Car> findCars(int year, User user) { 
    return Car.find.where().eq("year", int).eq("users", user).findList(); 
} 

Ist das mit Ebean möglich?

Antwort

11

prüfen ähnliche question (and answer)

Wahrscheinlich Ihre Finder sollte folgendermaßen aussehen:

public List<Car> findCars(int year, User user) { 
    return find.where().eq("year", year).eq("users.id", user.id).findList(); 
} 

BTW gehe ich davon aus, dass Sie einige id Feld haben aber nur zeigte uns nicht. Machen Sie Ihre Felder auch öffentlich, so dass Sie für beide keine Getter/Setter schreiben müssen.

+0

Ich benutzte private Felder, da ich Probleme hatte, Tests ohne Getter/Setter arbeiten zu lassen. http://stackoverflow.com/questions/13011874/why-ebean-returns-null-for-no-reason –

+0

Ja mit privaten Feldern, müssen Sie öffentliche Getters schreiben, das ist normal – biesior

+0

Offensichtlich :-) Aber der Link in meinem Kommentar beschreibt Bug/Feature in Ebean/Play 2 Combo, auf die ich mich bezog. –