本帖最后由 mahongcai 于 2009-12-09 16:09:53 编辑

解决方案 »

  1.   

    貌似用了联合主键,去年第一个条件(deviceIp=null)是什么效果?
      

  2.   

     "select new com.ysten.dto.NetworkElementDto(ne.neStatus) from "
            + "NeState ne  where 1=1";select new com.ysten.dto.NetworkElementDto执行是把当前查询的NeState 转化为一个NetworkElementDto,所以一个id对应一个new NetworkElementDto。
    from Nestate是一次查询所有的NeState ,并转化为一个list.
      

  3.   

    我理解也是这个意思啊, 但是为什么一个id对应一条sql语句呢? 而不是一次查询所有的?然后子啊封装成dto啊?
      

  4.   

    确实用了联合主键,我的语句执行时所有条件都为真,查询出了所有的数据,但每条数据都是以一条sql语句并以主键为条件去数据库查询的。  而不是一次查询出所有的? 请问这跟联合主键有点关系是吗?
      

  5.   

    所谓联合主键就是由大于1个主键构成,而你的条件只是联合主键的一个子键,当然是查询出很多条记录了。举个例子吧:public class UserPK{
        private String firstName;
        private String lastName;
    }public class User{
        private UserPK id;
        private String phone;
        private String address;
        private Calendar birthday;
    }
    User映射到数据表时大致如下:
    table_user
    firstName   lastName   phone   address   birthday
    ---------------------------------------------------------
    张             小明       010-888  北京市     2008-08-08
    张             大明       021-888  上海市     2007-07-07
    刘             小芳       020-888  广州市     2006-06-07
    张             小华       022-888  天津市     2005-05-05假如要查询出“张小明”的用户,而按楼主的条件就会查询出“张小明”、“张大明”和“张小华”三条记录,因为你的条件是:
    from User u where u.id.firstName='张'所以联合主键查询应将其作一个主键,如下:
    from User u where u.id=?
    问号代替的参数应该是UserPK对象,例如u.id=new UserPK("张","小明");
      

  6.   

    谢谢你的帮助, 那我问个问题,如果你的hql语句改成from User u 然后直接查询,hibernate是去数据库请求一条select * from User 语句还是去数据库请求4次(每次都已主键为条件分开查询)呢?