我想写一个简单的查询来检索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.

我知道我可以使用投影解决问题,但我的对象将是暂时的,我也验证它使用子查询来执行我的限制 .

但是我对使用变通办法并不满意,我不明白为什么它们在两个代码示例之间会有不同的表现?

选择被询问实体之外的字段对我没有意义 .