2016-11-01 7 views
1

Sagen, ich habe drei Sammlungen:cqengine kommen mehr als zwei Sammlungen

User 
User_Role 
Role 

Ich möchte ein Benutzer durch angegebenen Rollennamen kennen, aber ich muss auf user.id und user_role auf role.id beizutreten user_role zu etablieren der Benutzer. Zur Zeit all samples nur zeigen, wie ein mit zwei Sammlungen beitreten zu tun, das heißt

Query<Car> carsQuery = and(
       in(Car.FEATURES, "sunroof", "convertible"), 
       existsIn(garages, 
         Car.NAME, 
         Garage.BRANDS_SERVICED, 
         equal(Garage.LOCATION, "Dublin") 
       ) 
); 

Wie kann ich eine Abfrage erstellen ResultSet<Role> von einer gegebenen User user zu bekommen?


Das ist, was ich bisher habe, aber ich bin no suitable method found for and(Query<User>,Query<Role>,Equal<Role,String>)

String ROLE_NAME = "tester"; 
Query<User> query = and(
       existsIn(user_roles, 
         (Attribute<User, String>) (Object) User.ID_INDEX, 
         User_Role.USER_ID_INDEX 
       ), 
       existsIn(user_roles, 
         (Attribute<Role, String>) (Object) Role.ID_INDEX, 
         User_Role.ROLE_ID_INDEX 
       ), 
       equal(Role.NAME_INDEX, ROLE_NAME.toUpperCase()) 
); 

Antwort

2

Im Folgenden wird ein zwischen 3 IndexedCollections JOIN bekommen:

Hinweis - denken Sie daran: import static com.googlecode.cqengine.query.QueryFactory.*;

public static void main(String[] args) { 
    IndexedCollection<User> users = new ConcurrentIndexedCollection<>(); 
    users.add(new User(1, "Joe")); 
    users.add(new User(2, "Jane")); 
    users.add(new User(3, "Jesse")); 

    IndexedCollection<Role> roles = new ConcurrentIndexedCollection<>(); 
    roles.add(new Role(1, "CEO")); 
    roles.add(new Role(2, "Manager")); 
    roles.add(new Role(3, "Employee")); 

    IndexedCollection<UserRole> userRoles = new ConcurrentIndexedCollection<>(); 
    userRoles.add(new UserRole(1, 3)); // Joe is an Employee 
    userRoles.add(new UserRole(2, 2)); // Jane is a Manager 
    userRoles.add(new UserRole(3, 2)); // Jesse is a Manager 

    // Retrieve Users who are managers... 
    Query<User> usersWhoAreManagers = 
      existsIn(userRoles, User.USER_ID, UserRole.USER_ID, 
        existsIn(roles, UserRole.ROLE_ID, Role.ROLE_ID, equal(Role.ROLE_NAME, "Manager"))); 


    users.retrieve(usersWhoAreManagers) 
      .forEach(u -> System.out.println(u.userName)); 
    // ..prints: Jane, Jesse 
} 

..geben die folgenden Domänenobjekte - Benutzer, Rolle und Benutzer Rolle:

public class User { 
    final int userId; 
    final String userName; 

    public User(int userId, String userName) { 
     this.userId = userId; 
     this.userName = userName; 
    } 

    static final Attribute<User, Integer> USER_ID = attribute(u -> u.userId); 
    static final Attribute<User, String> USER_NAME = attribute(u -> u.userName); 
} 

public class Role { 
    final int roleId; 
    final String roleName; 

    public Role(int roleId, String roleName) { 
     this.roleId = roleId; 
     this.roleName = roleName; 
    } 

    static final Attribute<Role, Integer> ROLE_ID = attribute(r -> r.roleId); 
    static final Attribute<Role, String> ROLE_NAME = attribute(r -> r.roleName); 
} 

public class UserRole { 
    final int userId; 
    final int roleId; 

    public UserRole(int userId, int roleId) { 
     this.userId = userId; 
     this.roleId = roleId; 
    } 

    static final Attribute<UserRole, Integer> USER_ID = attribute(ur -> ur.userId); 
    static final Attribute<UserRole, Integer> ROLE_ID = attribute(ur -> ur.roleId); 
} 

Das Beispiel gilt oben auf Java 8.

Sie auch eine Version des Codes finden können, die mit Java 7.6 auf der CQEngine Website here und here verwendet werden kann.