我想编写一个简单的查询来检索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。
我知道我可以使用投影解决问题,但我的对象将是暂时的,我也验证了它使用子查询来实现我的限制。
但是我对使用变通办法并不满意,我不明白为什么它们在两个代码示例之间会有不同的行为?
选择被询问实体以外的字段对我没有意义。