Java 带有select和Concat的JPA JPQL请求
我有两个实体Java 带有select和Concat的JPA JPQL请求,java,select,jpa,concat,Java,Select,Jpa,Concat,我有两个实体 @Entity @Table(name = "users") public class User extends Model { public String name; @ManyToMany public List<Role> roles; } 表包含 Table Users | | Table Roles | |Table Users_roles | id | Name |
@Entity
@Table(name = "users")
public class User extends Model {
public String name;
@ManyToMany
public List<Role> roles;
}
表包含
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 |
我想进行以下查询(使用PostgreSql 9.1.12可以)
我有我想要的结果
User name | roles
User 1 |
User 3 | CEO
User 2 | CEO / MANAGER
您能帮我获取此请求的JPA语法吗?直接使用JPQL查询无法做到这一点。但是,您可以在用户实体中使用一个方法,该方法返回角色名称字符串,并获取用户及其角色:
List<User> users = em.createQuery("select u from User u left join fetch u.roles")
.getResultList();
List users=em.createQuery(“从用户u中选择u左加入获取u.roles”)
.getResultList();
使用Guava的Joiner,在User.java中:
public String getUserNames() {
List<String> roleNames = new ArrayList<String>();
for (Role role : roles) {
roleNames.add(role.getName();
}
return Joiner.on(" / ").join(roleNames);
}
公共字符串getUserNames(){
List roleNames=new ArrayList();
for(角色:角色){
添加(role.getName();
}
返回Joiner.on(“/”).join(角色名称);
}
如果您只需要数据,那么只需使用本机SQL查询来执行您拥有的SQL即可
如果需要对象,则只需选择用户对象并访问其在Java中的角色即可收集数据。要优化对角色的查询,您可以加入获取它,或批量获取它。我可以使用以下命令执行此请求:
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();
String jpql=“选择u.*”+
“数组\u到\u字符串(数组\u agg(r.name按r.name ASC排序),'/')”+
“来自用户u”+
“左外部加入用户\u角色u.id=u.users\u id”+
“r.id=ur.roles\u id上的完全加入角色r”+
“按用户id、用户id分组”+
“按数组顺序到字符串顺序描述”;
Query Query=Model.em().createNativeQuery(jpql);
scManager.bindParameters(查询);
List searchCriteriaUsers=newjpaquery(jpql,query).fetch();
请求是可以的,结果也是可以的。但是我正在寻找一个JPQL查询来按角色名称对列表进行排序
public String getUserNames() {
List<String> roleNames = new ArrayList<String>();
for (Role role : roles) {
roleNames.add(role.getName();
}
return Joiner.on(" / ").join(roleNames);
}
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();