0

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

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());

有人可以在这个问题上帮助我吗?

4

1 回答 1

0

我可以看到您的查询中有 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")) );

您可以在结果列表中进行 itarete,如下所示:

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));

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

于 2013-05-15T15:38:04.147 回答