Отображение проекционного Hibernate HQL-запроса в объект - PullRequest
0 голосов
/ 29 сентября 2018

Я возвращаю только несколько столбцов из таблицы в БД:

List<MyClass> l = (List<MyClass>) session.createQuery("Select p.one, p.two FROM MyClass p WHERE p.id IN :id")
                    .setParameter("userId", id)
                    .list();

Однако запрос возвращает список массивов, например,

l.get(0) // [0] is object representing p.one in query, [1] p.two

Есть ли какой-нибудь эффективный спящий режим?способ, как сопоставить его с объектом MyClass?Таким образом, запрос на самом деле будет возвращать список объектов MyClass, в которых выбранные свойства будут иметь значения, другие будут иметь значение null?

Я прочитал о new MyClass(arg1,arg2) пути в запросе с construtor, однако я также прочитал егонеэффективен.

Спасибо за помощь!

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Если вы хотите создать MyClass, вам просто нужно использовать полное имя класса в вашем запросе, например,

SELECT NEW my.pack.MyClass(p.one, p.two) FROM MyClass p WHERE p.id IN :id

Я не слышал о том, что это неэффективно, и яне могу представить, почему это будет.Он просто вызывает конструктор для результата, а не возвращает его в виде массива или объекта.В целом, это, вероятно, очень хороший способ выборки, поскольку вы выбираете только те поля, которые вам нужны.

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

0 голосов
/ 29 сентября 2018

Вы можете использовать try catch block и использовать query.getSingleResult (), чтобы вернуть Object.

Query query = em.createNativeQuery("FROM TipoUsuario WHERE NAME = :name;", TipoUsuario.class)
        .setParameter("name", name);

TipoUsuario tipoUsuario = null;

try
{
    tipoUsuario = (TipoUsuario) query.getSingleResult();
}
catch ( Exception e )
{
    return null;
}

createNativeQuery - это просто пример.Вместо этого вы можете использовать createNamedQuery и поместить HQL в Entity с аннотацией @ NamedQueries.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...