我正在使用非常复杂的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。
谢谢..
答案 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();