Hibernate изменяет структуру набора результатов (помещает Objects[]) в набор результатов при изменении DESC на ASC в отсортированном столбце «многие ко многим».

У меня есть следующие два разных оператора HQL.

Моя структура данных выглядит так:

Пользователь

@Entity (name = "User")
public class User
{

    @Id
    @GeneratedValue
    @Column (name = "id")
    private int id;
    @Column (name = "user_name")
    private String username;
    @Column (name = "password")
    private String password;
    @Column (name = "enabled")
    private boolean enabled;
    @ManyToMany (targetEntity = Role.class, cascade =
    {
        CascadeType.ALL
    })
    @JoinTable (name = "user_role", joinColumns =
    {
        @JoinColumn (name = "user_id")
    }, inverseJoinColumns =
    {
        @JoinColumn (name = "role_id")
    })
    private Set<Role> roles;

    /* getters and setters)
}

Короче говоря, единственная разница между двумя запросами заключается в том, что один из них — ASC, а другой — DESC.

@NamedQuery (name = "user.getUsersOrderByRoleAsc",
    query = "FROM User as u left outer join u.roles roles WHERE u.username like :username ORDER BY roles.name ASC"),
@NamedQuery (name = "user.getUsersOrderByRoleDesc",
    query = "FROM User as u left outer join u.roles roles WHERE u.username like :username ORDER BY roles.name DESC"),

Запрос для ASC возвращает: Список пользователей -> Как я и ожидал.

Запрос DESC возвращает: список объектов [], и в каждом объекте [0] — это пользователь, а [1] — просто еще один нулевой объект.

Это не имеет никакого смысла для меня. Как простая замена ASC на DESC может изменить структуру результирующего набора?

Я использую Hibernate 4.3.6.Final.


person seba.wagner    schedule 18.09.2014    source источник


Ответы (2)


Самый быстрый способ определить, что пошло не так, — установить флаг show_sql на true в файле конфигурации спящего режима. Это будет регистрировать каждый обработанный запрос.

См. Hibernate показывает реальный SQL.

person Hannes    schedule 18.09.2014
comment
Я уже сделал это, вывод SQL выглядит ТОЧНО так же (за исключением части заказа, конечно), независимо от того, пытаюсь ли я выполнить запрос ASC или DESC. - person seba.wagner; 19.09.2014
comment
Взглянув на тестовые классы спящего режима (ASTParserLoadingOrderByTest), я вижу, что порядок всегда используется с псевдонимами. Строка 558 пахнет обходным путем... - person Hannes; 19.09.2014

Вероятно, вы столкнулись с какой-то ошибкой Hibernate, но, поскольку вы присоединяетесь к выборке от одной до многих дочерних коллекций, безопаснее также использовать отдельные:

@NamedQuery (name = "user.getUsersOrderByRoleAsc",
query = "select distinct u FROM User as u left outer join u.roles roles WHERE u.username like :username ORDER BY roles.name ASC"),
@NamedQuery (name = "user.getUsersOrderByRoleDesc",
query = "select distinct u FROM User as u left outer join u.roles roles WHERE u.username like :username ORDER BY roles.name DESC")
person Vlad Mihalcea    schedule 18.09.2014