2012-01-10 26 views
0

這是我對這些網站的第一個問題,所以原諒我的不專業。Playframework錫耶納過濾和訂貨

我用playframework與SIENA模塊(與GAE)和我來到翻過了以下問題: 由於3個實體:

public class Meeting extends Model{ 

    @Id 
    public Long id; 

    public String place; 

    @Owned 
    Many<MeetingUser> users; 
    . 
    . 
    . 

} 

public class User extends Model{ 

    @Id 
    public Long id; 

    public String firstName; 
    public String lastName; 

    @Owned 
    Many<MeetingUser> meetings; 
    . 
    . 
    . 

} 

public class MeetingUser extends Model{ 

    @Id 
    public Long id; 

    public Meeting meeting; 
    public User user; 
    . 
    . 
    . 
    public User getUser(){ 
     return Model.all(User.class).filter("id", user).get(); 
    } 

    public Meeting getMeeting(){ 
     return Model.all(Meeting.class).filter("id", meeting).get(); 
    } 

} 

比如我列出一個會議,他們的所有用戶:

public static void meetingInfo(Long meetingId){ 
    Meeting meeting = Models.all(Meeting.class).filter("id",meetingId); 
    List<MeetingUser> meetingusers = meeting.asList(); 
    List<User> users = new ArrayList<User>(); 
    for(MeetingUser mu: meetingusers){ 
     users.add(mu.getUser()); 
    } 
    render(users); 
} 

這樣做(有沒有什麼更好的辦法嗎?),但是,當涉及到過濾(特別是對於許多許多領域的動態過濾),我不能使用查詢的過濾方法在MeetingUser爲我需要在MeetingUser的字段的字段(firstName)上進行篩選。訂購時出現同樣的問題。我需要解決這兩個問題。

我希望我的問題是清楚的,我在這裏感謝任何形式的幫助。

回答

0

記住,你是在GAE這是一個的NoSQL數據庫。 所以你不能就加入請求,因爲RDBMS。 然而,這並不是真正的pb你所以這只是爲了確保你知道它;)

所以,如果你想找到在給定的會議中給予firstname的人,你可以嘗試以下:

List<MeetingUser> meetingusers = meeting.users.asQuery().filter("firstname", "XXX"); 

(你也可以訂購)

然而,知道你不能參加,請記住,你不能寫一個查詢搜索,其中有用戶,其名字是XXX會議因爲它需要一些連接,而GAE中不存在。在這種情況下,您需要更改以下NoSQL的理念,你的模型,但是這是另一個問題

問候


讓我們嘗試給出一個方式做你想要的...

你的關係是多到很多這始終是最壞的情況下:)

要過濾的用戶姓名會議。
它需要加入請求,這是不可能的GAE。在這種情況下,您必須通過非規範化來更改模型(有時也使用冗餘)並自行管理連接。實際上,你必須自己完成RDBMS的工作。看起來過分誇張,但事實上,這很容易。唯一的缺點是您必須對數據庫執行多個請求。 NoSQL意味着沒有Schema(&沒有聯接),所以有一些缺點,但它允許擴展和管理巨大的數據加載......這取決於您的需求:)

您所做的創建MeetingUser的選擇是一個「加入」表和一種反規範化在GAE中是很好的,因爲它允許您自己管理連接。

解決方案:

// fetch users by firstname 
List<User> users = users.all().filter("firstName", "John").fetch(); 
// fetch meetingusers associated to these users (verify the "IN" operator works because I didn't use that for a long time and don't remember if it works with this syntax) 
List<MeetingUser> meetingusers = MeetingUser.all().filter("user IN", users); 
// now you must fetch the whole meeting because in MeetingUser, only the Meeting ID is stored (other fields are Null or O) 
List<Meeting> meetings = new ArrayList<Meeting>() 
for(MeetingUsers mu:meetingusers) { 
    meetings.add(meetingusers.meeting); 
} 
// use the batch feature to fetch all objects 
Meeting.batch(Meeting.class).get(meetings); 

// you have your meetings 

希望這有助於!

+0

我不知道你加入請求是什麼意思。什麼是GAE兼容性的解決方案。 您的示例在我的經驗中不起作用,如您所說: meeting.users.asQuery()//返回查詢 .filter(「firstname」,「XXX」)。fetch(); //會產生一個錯誤,因爲MeetingUser類沒有「firstname」字段。 – 2012-01-11 14:32:27

+0

加入請求是在同一時間在幾個表上的請求...經典的SQL JOIN(你可以在網上找到關於它的信息) – mandubian 2012-01-11 14:45:45

+0

關於我的示例,我以爲你想過濾MeetingUsers的名字...所以看起來我不明白你想要什麼...... – mandubian 2012-01-11 14:46:23