2017-10-05 44 views
0

我正在使用非常复杂的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。

谢谢。

+0

使用标准复杂的查询(特别是多连接)将导致性能问题,我怀疑你可以做多改善它。您应该使用Hibernate原生查询,这里解释https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querysql.html –

+0

@dsp_user感谢您的SQL查询引用。我尝试过这个。但正如问题中提到的,我有很多加入集合(实际上我有4个集合加入嵌套)。从第二级加入起,我收到了一个空集。另外,我得到的A实体的拷贝比预期的多(从数据库返回的行)。我在新查询中使用SQLQuery.addEntity(String,Class)和SQLQuery.addJoin(String,String)。 – AJA

回答

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(); 
+0

我不明白使用变量'example'。 – AJA

+0

对不起,我一直在更新答案。 – Zigri2612

+0

感谢您的努力。但这正是我用'Example'试过的,它似乎并没有减少对数据库的查询。 – AJA

相关问题