我想写一个简单的查询来检索USER列表,对CUSTOMER连接表有一个简单的限制 . 我只对USER实体感兴趣 .
如果我使用HPQL编写它:
public List<Users> getAssociatedAdminObs(Integer pCustId) {
Criteria crit = getCriteriaForObsAdmin("USER");
crit.createCriteria("clients").add(Restrictions.eq("idCustomer", pCustId));
return crit.list();
StringBuilder hqlQuery = new StringBuilder().append("select u from Users as u join u.customers as c where c.idCustomer=:idCustomer");
Query q = getSessionAndManageFilter().createQuery(hqlQuery.toString());
q.setInteger("idCustomer", pCustId);
return q.list();
}
仅生成的SQL按预期选择USER实体中的所有字段 .
现在,如果我通过Hibernate标准API编写它:
public List<Users> getAssociatedAdminObs(Integer pCustId) {
Criteria crit = getSession().createCriteria(Users.class);
crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
crit.createCriteria("customers").add(Restrictions.eq("idCustomer", pCustId));
return crit.list();
}
生成的SQL从USER实体中选择所有字段,也从CUSTOMER实体中选择 .
我正在使用hibernate-core 3.3.1.GA.
我知道我可以使用投影解决问题,但我的对象将是暂时的,我也验证它使用子查询来执行我的限制 .
但是我对使用变通办法并不满意,我不明白为什么它们在两个代码示例之间会有不同的表现?
选择被询问实体之外的字段对我没有意义 .