//以下bean省略set get
public class User{
  int id;
  Dept dept;
}public class Dept{
  int id;
  int code;
  String name;
}//以上两个bean,早dao层我使用以下代码得到两个查询对象
Criteria criteria = getSession().createCriteria(getEntityClass());//User
Criteria criteria1=criteria.createCriteria("dept");//Dept//也可以使用以下代码得到and条件的数据
criteria.add(Restrictions.eq("id", "1"));
criteria1.add(Restrictions.eq("id", "2"));//但如果我希望使用or时应该怎么做呢,这两个条件可是不同对象里的
Restrictions.or(Restrictions.eq("id", "1"), Restrictions.eq("id", "2"));

解决方案 »

  1.   

    晕,我刚学完hibernate 怎么没见过Criteria啊
      

  2.   

    不同对象要使用or时,要这么做。
    http://blog.csdn.net/licip/archive/2008/07/10/2636036.aspx
      

  3.   

    不错,试过有效,但是未根本解决问题,以下贴出代码:Criteria criteria = getSession().createCriteria(getEntityClass());
         criteria.createAlias("depts", "dept");
         criteria.createAlias("users", "user");     System.out.println("user id = "+userSession.getId());
        
         criteria.add(
         Restrictions.disjunction()
         .add(
         Restrictions.conjunction()
         .add(Restrictions.eq("inheritance", 0))
         .add(Restrictions.eq("dept.id", userSession.getDeptId()))
         )
         .add(
         Restrictions.eq("user.id", userSession.getId())
         )
         );
        
      

  4.   


    你user和dept有没有做关联。如果两个别名的问题不能解决。就尝试做关联。
    如 user 多对一 dept.user对象中包含一个dept对象。
    criteria 如下,如果只是查询id的话可以不用别名。但是如果要查询到 user.dept.deptName。就必须要做别名了。Criteria criteria = getSession().createCriteria(getEntityClass())
                        .add(Restrictions.eq("user.id", 1)) 
                        .add(Restrictions.eq("user.dept.id", 2));
    这样应该能查询到user id=1 并且 user对应的dept id =2 的user对象。我只是假定你的问题可以转化为user到dept多对一的关联。我想你既然两张表连表查询不可能之间没有关系吧。如果你user dept是一对多 或者 多对多。也就是user中包含dept集合 Set<dept> depts,这个时候必须创建别名。Criteria criteria = getSession().createCriteria(getEntityClass())
                        criteria.createAlias("user.depts.id", "user.depts.id")
                        .add(Restrictions.eq("user.id", 1)) 
                        .add(Restrictions.eq("user.depts.id", 2));很久没用了 你试试看,有问题再研究。
      

  5.   

    我是这样的情况 
    表: link
    中有set 属性depts及users
      

  6.   

    现在的情况是一旦有两个别名结果集就为空了,条件不起作用
    Criteria criteria = getSession().createCriteria(getEntityClass());
    criteria.createAlias("depts", "dept");
    criteria.createAlias("users", "user");
    criteria.add(Restrictions.eq("dept.id", userSession.getDeptId()));这是最基本的,本应由数据,但是出不来,一旦注释users别名那一行就可以出来
      

  7.   

    Criteria criteria = getSession().createCriteria(getEntityClass()) 
                        .criteria.createAlias("users.id", "users.id") 
                        .criteria.createAlias("depts.id", "depts.id")
                        .add(Restrictions.eq("users.id", 1)) 
                        .add(Restrictions.eq("depts.id", 2)); 
    我的criteria也没学得很烂。你试试这种不用替换的形式看看。至于你给users定义了别名,但却没有查询条件,会不会有问题呢???
      

  8.   

    为什么要用两个别名呢?
    Criteria criteria = getSession().createCriteria(getEntityClass());不就代表了User了吗,你再写criteria.createAlias("users", "user"); 就表示User包含User了。
      

  9.   

    打印sql语句看了一下,原来是因为hibernate使用了inner join造成的,
    select this_.*
    from linktree_link this_ 
    inner join linktreelink_dept depts4_ on this_.id=depts4_.linktreelink_id 
    inner join system_depts dept1_ on depts4_.dept_id=dept1_.id 
    inner join linktreelink_user users6_ on this_.id=users6_.linktreelink_id 
    inner join system_users user2_ on users6_.user_id=user2_.id 
    where dept1_.id=2以上是简化后的语句,如果使用left join就可以出正确的结果。
    因为我是希望以主表
    linktree_link
    数据为准。可现在的结果让人郁闷了、
      

  10.   

    原来(getEntityClass())是user对象。那这就不对了,user 跟dept 有关联么 没关联的话怎么能用关联查询。
      

  11.   

    既然已经知道是inner join的问题了。
    那么我看了一下,createAlias还有一个从构的方法,第三个参数就是指定连接类型了,
    呵呵!
    criteria.createAlias("depts", "dept",CriteriaSpecification.LEFT_JOIN);
    criteria.createAlias("users", "user",CriteriaSpecification.LEFT_JOIN);这样就可以了。谢谢各位关心,问题解决,各位提供了非常宝贵的意见!
      

  12.   

    还是有点不明白你到底想查询什么。你用自然语言描述一下。你添加的是左外连接,跟内连接 inner join是两回事。结果也会有偏差。
      

  13.   

    的确是两回事,内连接查询会将所有表连接在一起,
    当其中任意一表没有符合条件的数据时,则不会返回数据
    而左连接以左边的表数据为基础,当没有限定条件时返回左表数据例:
    表:link
    id 
    1
    2
    3表:dept
    id link_id
    1   1表: user
    id link_id
    1   2 
      

  14.   

    员工表client (clientId,companyId)公司表company (companyId)
    业务表business (businessId)
    公司对应业务表 company2business (companyId,businessId) 想要通过业务条件来查询到客户的信息,不知道怎么查了。。
    如:查询业务表中 所有经营电器的公司 的所有员工信息。如何通过hibernate 的criteria来进行查询呢??
      

  15.   

    用 Criteria criteria = getSession().createCriteria(getEntityClass());criteria.add(Expression.or(Expression.eq("字段",obj), Expression.eq("字段",obj),obj));criteria.list();