2012-03-05 48 views
0

我有两个实体有选择和的毗连

@Entity 
@Table(name = "users") 
public class User extends Model { 
    public String name; 

    @ManyToMany 
    public List<Role> roles; 
} 

而且

@Entity 
@Table(name = "roles") 
public class Role extends Model { 
    public String name; 
} 

表JPA JPQL请求包含

Table Users |  | Table Roles |   |Table Users_roles | 
id | Name |  | id | Name |   |users_id | roles_id | 
1  | User 1 |  | 1  | CEO  |   | 2  | 1  | 
2  | User 2 |  | 2  | Manager |   | 2  | 2  | 
3  | User 3 |          | 3  | 1  | 

我要让下面的查询(OK在PostgreSQL 9.1 .12)

SELECT u.*, array_to_string(array_agg(r.name ORDER BY r.name ASC), '/') 
    FROM users u 
    LEFT OUTER JOIN users_roles ur ON u.id=ur.users_id 
    FULL JOIN roles r ON r.id=ur.roles_id 
    GROUP BY u.id, ur.users_id 
    ORDER BY array_to_string ASC 

我有结果我想

User name | roles 
User 1 |   
User 3 | CEO   
User 2 | CEO/MANAGER   

你能帮助我获得此请求的JPA语法?

回答

1

无法直接使用JPQL查询来做到这一点。但是,你可能只是在它返回角色名称的字符串用户实体的方法,并与他们的角色获取用户:

List<User> users = em.createQuery("select u from User u left join fetch u.roles") 
        .getResultList(); 

,并利用番石榴的木匠,在User.java:

public String getUserNames() { 
    List<String> roleNames = new ArrayList<String>(); 
    for (Role role : roles) { 
     roleNames.add(role.getName(); 
    } 
    return Joiner.on("/").join(roleNames); 
} 
0

如果您只是想要数据,那么只需使用本机SQL查询来执行您拥有的SQL。

如果你想要对象,那么只需选择User对象并访问它们在Java中的角色来收集数据。要优化对角色的查询,您可以加入获取或批量获取它。

0

我可以通过做这个请求:

String jpql = "SELECT u.*," + 
    " array_to_string(array_agg(r.name ORDER BY r.name ASC), '/ ')" + 
    " FROM users u" + 
    " LEFT OUTER JOIN users_roles ur ON u.id=ur.users_id" + 
    " FULL JOIN roles r ON r.id=ur.roles_id" + 
    " GROUP BY u.id, ur.users_id" + 
    " ORDER BY array_to_string DESC" ; 

Query query = Model.em().createNativeQuery(jpql); 
scManager.bindParameters(query); 

List<Object[]> searchCriteriaUsers = new JPAQuery(jpql, query).fetch(); 

请求成功和结果。但我正在寻找JPQL查询来按角色名称排序列表...