JPA JPQL-запрос с выбором и Concat - PullRequest
0 голосов
/ 05 марта 2012

У меня есть две сущности

@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 для этого запроса?

Ответы [ 3 ]

1 голос
/ 05 марта 2012

Нет способа сделать это напрямую с помощью запроса JPQL. Но вы могли бы просто иметь метод в сущности User, который возвращает строку имен ролей и извлекать пользователей с их ролями:

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

и, используя Guava's 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);
}
0 голосов
/ 06 марта 2012

Я могу сделать этот запрос, используя:

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-запрос, чтобы упорядочить список по имени роли ...

0 голосов
/ 05 марта 2012

Если вам нужны данные, просто используйте собственный SQL-запрос для выполнения имеющегося у вас SQL.

Если вы хотите объекты, просто выберите объекты User и получите доступ к их ролям в Java, чтобы собратьданные.Чтобы оптимизировать запрос к ролям, вы можете присоединиться к нему или получить его по пакетам.

...