我正在使用非常复杂的Hibernate Criteria从我的数据库中获取数据。如何使用Hibernate Criteria从db中提取字段?
假设我有以下实体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*/
}
而让我用它来获取准则是
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获取模式,因为应用程序立即需要这些字段。我检查了被解雇的数据库的查询。所有A,B,C和D中的很多字段都是从db中获取的,而这些不是必需的。我试图阻止这些字段的获取。我试图Example.excludeProperty()
提到here。我不缩短查询。当我使用投影时,我不得不写一个自定义结果转换器。这个问题有没有简单的解决方案?我正在使用PostgreSQL。
谢谢。
使用标准复杂的查询(特别是多连接)将导致性能问题,我怀疑你可以做多改善它。您应该使用Hibernate原生查询,这里解释https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –
@dsp_user感谢您的SQL查询引用。我尝试过这个。但正如问题中提到的,我有很多加入集合(实际上我有4个集合加入嵌套)。从第二级加入起,我收到了一个空集。另外,我得到的A实体的拷贝比预期的多(从数据库返回的行)。我在新查询中使用SQLQuery.addEntity(String,Class)和SQLQuery.addJoin(String,String)。 – AJA