我正在尝试获取其状态仍显示为非活动状态的用户列表并处理它们。 此用户嵌入了UserDetails,UserActivity实体。所有实体表都具有状态列,其值为“非活动”。
现在我正在使用分离标准,
detachedcriteria.for class(User.class).add(Restrictions.
Eq("status","Inactive").setresulttransformer(criteria.distinct_element)
这给了我User对象及其嵌入的实体作为单个User对象。
但是现在,我必须调整查询以确保嵌入式类的状态也是非活动的。所以我选择了进行命名查询,因为我不知道如何在单个分离标准中为不同实体添加多个限制。
在命名查询中,我将连接所有表以获取数据。我能够获取数据,但它返回的对象数组列表。此列表的第一个对象中包含以下实体的数组。
命名查询:
from User us, UserDetail ud, UserActivity uc where us.id=ud.id and us.id=uc
.id and us.status=ud.status and us.status=uc.status and us.status='Inactive'
List<User>=query.list ();
Object ob=lst.get(0);
Where ob contains [User(),UserDetail(),UserActivity ()].
我们是否可以在单个分离标准中为不同实体设置多个限制?
我可以有一个命名查询,当我进入detachedcriteria时,它会返回一个User对象及其中的嵌入实体吗?(这样我就可以直接执行User.getUserDetail()
)。
答案 0 :(得分:0)
您可以使用别名:
假设你有像
这样的用户类class User {
...
private UserDetail userDetail;
private UserActivity userActivity;
...
}
您无法直接对对象的二级属性设置限制。通过使用.createAlias()
方法,您可以向生成的SQL添加JOIN
语句,并使用别名添加限制。
DetachedCriteria dc = DetachedCriteria
.forClass(User.class , "u")
.add(Restrictions.Eq("u.status","Inactive")
.createAlias("u.userDetail", "ud")
.add(Restrictions.Eq("ud.status","Inactive")
.createAlias("u.userActivity", "ua")
.add(Restrictions.Eq("ua.status","Inactive")
.setResultTransformer(Criteria.DISTINCT_ROOT_ELEMENT);