如何使用Hibernate Criteria排除从db中获取字段?

时间:2017-10-05 05:58:24

标签: java postgresql hibernate

我正在使用非常复杂的Hibernate Criteria从我的数据库中获取数据。

假设我有以下实体A,B,C,D(实际上我有更多这样的实体)并让他们的类成为

A{
    /*some other fields*/
    private String key;
    private List<B> bList;
}

B{
    /*Some other fields*/

    private Set<C> cSet;
}

C{
    /*Some other fields*/
    private D d;
}

D{
    /*Some fields*/
}

让我用来获取A的标准

Criteria criteria = getCurrentSession().createCriteria(A.class);
criteria.add(Restrictions.eq("key", "myKey"));

criteria.setFetchMode("bList", FetchMode.JOIN);
criteria.setFetchMode("bList.cSet", FetchMode.JOIN);
criteria.setFetchMode("bList.cSet.d", FetchMode.JOIN);

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

A a = criteria.uniqueResult();

这很好,我得到了结果。但正如我已经提到的,这是我实际查询的一个非常简化的版本。我的实际查询有很多这样的连接提取,它会导致性能问题。我无法避免这种JOIN获取模式,因为应用程序立即需要这些字段。我检查了向db发出的查询。所有A,B,C和D的字段都是从数据库中提取的,这些字段是不需要的。我试图阻止这些领域的取得。我按照here提到Example.excludeProperty()。我没有缩短查询。当我使用投影时,我被迫编写自定义结果转换器。这个问题有什么简单的解决方案吗?我正在使用PostgreSQL。

谢谢..

1 个答案:

答案 0 :(得分:0)

excludeProperty应该以这种方式应用---

Example example = Example.create(A).excludeProperty("property1")
                 .excludeProperty("property2");
Criteria criteria = getCurrentSession().createCriteria(A.class)
                     .add(example);
criteria.add(Restrictions.eq("key", "myKey"));

criteria.setFetchMode("bList", FetchMode.JOIN);
criteria.setFetchMode("bList.cSet", FetchMode.JOIN);
criteria.setFetchMode("bList.cSet.d", FetchMode.JOIN);

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

A a = criteria.uniqueResult();