2012-01-10 3 views
0

이것은 내 웹 사이트 중 첫 번째 질문이므로 내 비 전문성을 용서해주십시오.Playframework Siena 필터링 및 주문

나는 (GAE와) 시에나 모듈 playframework를 사용하고 난 다음과 같은 문제가 건너 온 : 예를 들어

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(); 
    } 

} 

내가 회의 목록 및 모든 사용자입니다 : 을 감안할 때 3 개 단체

이것은 완료되었습니다 (더 좋은 방법이 있습니까?) 그러나 필터링 (특히 많은 필터를 동적으로 필터링)의 경우 MeetingUser에서 쿼리의 필터 방법을 사용할 수 없습니다. MeetingUser의 필드 (firstName) 필드를 필터링해야합니다. 주문시에도 동일한 문제가 발생합니다. 두 가지 문제에 대한 해결책이 필요합니다.

제 문제가 명확하고 여기에 도움을 주시면 감사하겠습니다.

답변

0

NoSQL DB 인 GAE에 있다는 것을 기억하십시오. RDBMS에서와 같이 Join 요청을 할 수 없습니다. 그러나 이것은 실제로 당신이 가지고있는 돼지가 아니므로 이것은 단지 당신이 알고 있다는 것을 확신하기위한 것입니다.)

그래서 주어진 회의에서 이름을 가진 사람을 찾으려면 다음을 시도해 볼 수 있습니까? :

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

는 사용자 FIRSTNAME XXX입니다 거기에있는 회의 검색 쿼리를 쓸 수없는 기억, 당신은 가입 할 수 없습니다 것을 알고,

그럼에도 불구하고 (당신은 또한 주문할 수 있습니다) 일부 조인이 필요하고 GAE에는 존재하지 않기 때문입니다. 이 경우, ...

귀하의 관계를 당신은 NoSQL의 철학을 다음과 같은 모델을 변경해야하지만이

안부


의 당신이 원하는 것을 할 수있는 방법을 제공하려고하자 또 다른 될 수 있습니다 항상 최악의 경우 인 Many-to-Many입니다.

사용자의 이름으로 모임을 필터링하려고합니다.
GAE에서는 불가능한 가입 요청이 필요합니다. 이 경우 모델을 비정규 화하여 모델을 변경하고 (중복성도 사용하는 경우도 있음) 혼자서 조인을 관리해야합니다. 사실, RDBMS의 작업을 직접 수행해야합니다. 잔인한 것처럼 보이지만 실제로는 아주 쉽습니다. 유일한 단점은 DB에 대한 여러 요청을 수행해야한다는 것입니다. NoSQL은 스키마 없음 (& 가입 안 함)이므로 몇 가지 단점이 있지만 대용량 데이터로드를 관리하고 규모를 조정할 수 있습니다. 필요에 따라 달라집니다.

다음과 같은 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"필드가 없으므로 오류가 발생합니다. –

+0

가입 요청은 동시에 여러 테이블에 대한 요청입니다 ... 고전적인 SQL JOIN (그물에 대한 정보를 찾을 수 있습니다) – mandubian

+0

내 샘플에 대해, 나는 당신이 MeetingUsers firstname에 걸러 내고 싶다고 생각했습니다 ... 그래서 그것은 내가 원하는 것을 이해하지 못했던 것 같습니다 ... – mandubian