【问题标题】:How to achieve equi join using hibernate criteria from hbm.xml files如何使用 hbm.xml 文件中的休眠标准实现 equi join
【发布时间】:2013-05-10 04:16:17
【问题描述】:

如何在hibernate中为此查询编写条件,

select u.userID, ur.authority from users u, user_roles ur where u.userID = ur.userID and u.userName ="sandy"

我尝试过这种方式,但我得到一个空列表,

DetachedCriteria ownerCriteria = DetachedCriteria.forClass(users.class);
ownerCriteria.setProjection(Property.forName("userID"));
ownerCriteria.add(Restrictions.eq("userName", "sandy"));

Criteria criteria = session.createCriteria(user_roles.class);
criteria.add(Property.forName("userID").in(ownerCriteria));
System.out.println(criteria.list());

有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: hibernate criteria


    【解决方案1】:

    我可以看到您的查询中有 u.userID = ur.userID,这是否意味着 user 和 user_roles 之间存在一对多的关系?

    如果答案是肯定的,你可以这样做:

    Criteria criteria = session.createCriteria(user_roles.class,"ur")
        .createCriteria("userDto","u")
        .add(Restrictions.eq("userName", "sandy"));
    

    然后在查询中添加投影:

    criteria.setProjection( Projections.projectionList()
        .add(Projections.property("u.userID").as("userID"))
        .add(Projections.property("ur.authority").as("authority")) );
    

    您可以在结果列表中进行如下操作:

    for(Object[] item:criteria.list()){
        System.out.println( (String)item[0] ); //User id
        System.out.println( (String)item[1] ); //Authority
    }
    

    关于您的代码:

    criteria.add(Property.forName("userID").in(ownerCriteria));
    

    您正在将属性与子查询进行比较,因此它可能没有按照您的想法执行,但我的猜测可能有误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2016-04-01
      • 2011-10-09
      • 2012-12-24
      相关资源
      最近更新 更多