簡體   English   中英

帶有select和Concat的JPA JPQL請求

[英]JPA JPQL request with select and Concat

我有兩個實體

@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;
}

表格包含

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)

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語法嗎?

無法通過JPQL查詢直接做到這一點。 但是您可以在User實體中只有一個方法,該方法返回角色名稱的字符串,並使用其角色獲取用戶:

List<User> users = em.createQuery("select u from User u left join fetch 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);
}

如果只需要數據,則只需使用本機SQL查詢來執行您擁有的SQL。

如果需要對象,則只需選擇User對象並訪問其在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();

該請求是可以的,結果是。 但是我一直在尋找一個JPQL查詢來按角色名稱排序列表...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM