【问题标题】:How to return specific type instead of List<Object[]> in Hibernate Criteria?如何在 Hibernate Criteria 中返回特定类型而不是 List<Object[]>?
【发布时间】:2017-02-15 13:35:36
【问题描述】:

我有两节课

@Entity
public class user implements Serializable{
...
private Set<article> uploaded = new HashSet<article>();
...
@OneToMany(mappedBy="uploader")
public Set<article> getUploaded() {
return uploaded;
}

@Entity
public class article  implements Serializable{
....
private user uploader;
....
@ManyToOne
public user getUploader() {
    return uploader;
}

所以数据库中也有两个表:user 和 article。我尝试使用 Criteria 获取数据:

tx = session.beginTransaction();
Criteria cr = session.createCriteria(article.class);
...
List<article> list = cr.list();

但是返回的列表不是List&lt;article&gt;,而是一个List&lt;Object&gt;,包含了ARTICLE和USER,我不知道如何从列表中获取ARTICLE数据。如果我设置了 FetchType.Lazy,那么返回的列表将是 List&lt;article&gt; 没有 USER 数据,但我还需要 USER 数据...

【问题讨论】:

    标签: java hibernate criteria


    【解决方案1】:

    Criteria Hibernate 类list() 方法返回一个原始列表。因此,如果您尝试投射 如果您收到未经检查的警告。

    但是返回的列表不是L​​ist,而是一个包含ARTICLE和USER的List

    它不包含文章和用户,它只包含您在创建条件时传递的类型。在这种情况下:

    Criteria cr = session.createCriteria(article.class);
    

    返回的列表将包含文章对象。

    您可以通过不同的方式获取文章列表:

    最简单的一个:

    //Cast the raw list, but this will give you an unchecked warning
    List<article> list = (List<article>) cr.list(); 
    

    或者您可以复制另一个列表中的值:

    List<Object> list = cr.list();
    List<article> articles = new ArrayList<article>();
    
    for(Object object : list) {
       if(object instanceof article) {
          articles.add((article) object);
       } 
    }
    

    看看这个帖子:What is the "proper" way to cast Hibernate Query.list() to List<Type>?

    无论如何,类名必须以 Java 命名约定的大写字符开头。文章 -> 文章,用户 -> 用户

    【讨论】:

    • 非常感谢您的回答!我做了一些测试,它的工作原理是这样的:List
      articles = new ArrayList
      (); for (Object[] object : list) { article.add((article) object[1]); }
    【解决方案2】:

    使用 Projection 或 ResultSetTransformer:

    .setResultTransformer(Transformers.aliasToBean(article.class));

    很容易用谷歌搜索。

    【讨论】:

      猜你喜欢
      • 2012-06-05
      • 2016-03-05
      • 1970-01-01
      • 2022-07-11
      • 1970-01-01
      • 2019-01-20
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      相关资源
      最近更新 更多