2015-01-03 51 views
0

DB에서 완벽하게 유지되는 DB4O를 사용하여 다음 엔티티를 유지해야합니다.DB4O 쿼리 문제

public class Message { 

    private String userFrom; 
    private String userTo; 
    private String message; 
    private Date received; 
    private Boolean readed; 

    ... 

} 

하나의 쿼리를 통해 지속 된 개체를 복구하는 동안 문제가 발생했습니다.

SQL을 사용하면 이와 같이 나타납니다.

SELECT * FROM Message WHERE readed = 0 
AND ((userFrom = 'asd' AND userTo = 'qwe') OR (userFrom = 'qwe' AND userTo = 'asd')) 
ORDER BY received DESC 

현재 잘못된 DB4O 쿼리는 다음과 같을 수 있습니다.

Query query = super.getQuery(); 
query.constrain(Message.class); 

Query readedQuery = query.descend("readed"); 
Query receivedQuery = query.descend("received"); 
Query userToQuery = query.descend("userTo"); 
Query userFromQuery = query.descend("userFrom"); 

receivedQuery.orderDescending() 
    .constrain(readedQuery.constrain(Boolean.FALSE)) 
     .and(userToQuery.constrain("asd") 
       .and(userFromQuery.constrain("qwe")) 
      .or(userToQuery.constrain("qwe") 
       .and(userFromQuery.constrain("asd")))); 

return query.execute(); 

답변

0

솔루션 :

receivedQuery.sortBy(new Comparator<Message>() { 

    @Override 
    public int compare(Message message1, Message message2) { 

     return message1.getReceived().after(message2.getReceived()) ? 1 : -1; 
    } 
}).readedQuery.constrain(Boolean.FALSE) 
    .and(userToQuery.constrain("asd") 
     .and(userFromQuery.constrain("qwe")) 
    .or(userToQuery.constrain("qwe") 
     .and(userFromQuery.constrain("asd"))));