将投影形式的休眠HQL查询映射到对象

时间:2018-09-28 23:11:43

标签: java spring hibernate hql

我仅从数据库表中返回几列:

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?

我已经在construtor的查询中了解了new MyClass(arg1,arg2)的方式,但是我也读到它无效。

感谢帮助!

2 个答案:

答案 0 :(得分:0)

您可以使用try catch块并使用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放在带有注释@NamedQueries的Entity中。

答案 1 :(得分:0)

如果您要创建MyClass,则只需在查询中使用该类的标准名称即可,例如

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

我还没有听说过这种方法无效,也无法想象为什么会这样。它只是对结果调用构造函数,而不是将其作为数组或对象返回。总体而言,这可能是一种非常好的获取方法,因为您只需选择所需的字段即可。

此选项和其他选项也将更详细地说明here