【问题标题】:How does Criteria and HQL query return valuesCriteria 和 HQL 查询如何返回值
【发布时间】:2018-10-18 13:48:47
【问题描述】:

伙计们,我想问你一个简单的问题。 我创建了两个相同的查询,一个带有条件,一个带有 HQL。

HQL 示例

@Override
public List<Object[]> getAllLoginHQL() {
    Query<Object[]> query = manager.getSession()
            .createQuery("select user.firstName from User user",Object[].class);
    return query.getResultList();
}

标准示例:

@Override
public List<User> getAllLoginCriteria() {
    Criteria criteria = manager.getSession()
            .createCriteria(User.class)
            .setProjection(Projections.projectionList()
                    .add(Projections.property("firstName"), "firstName"))
            .setResultTransformer(Transformers.aliasToBean(User.class));

    return criteria.list();
}

如您所见,两个查询执行相同的操作,但是当我尝试创建返回类型为 List&lt;User&gt; 的 HQL 查询时,我收到异常消息,该查询的返回类型为 List&lt;String&gt;。 我想知道为什么 Criteria 可以返回整个对象(内部为 null),即使我要求一/两列并且 HQL 只返回特定列?

这个 HQL 查询,给出异常

@Override
public List<User> getAllLoginHQL() {
    Query<User> query = manager.getSession()
            .createQuery("select user.firstName from User user",User.class);
    return query.getResultList();
}

异常信息:

Type specified for TypedQuery  is incompatible with query return type [class java.lang.String]

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    here

    规范说您可以通过设置 ResultTransformer 来实现。

    应该是这样的:

       manager.getSession()
                .createQuery("select user.firstName from User user",Object[].class)
                .setResultTransformer(Transformers.aliasToBean(User.class))
                .getResultList();
    

    【讨论】:

      猜你喜欢
      • 2019-06-12
      • 2017-07-18
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多