Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带有select和Concat的JPA JPQL请求_Java_Select_Jpa_Concat - Fatal编程技术网

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