我有3张桌子。用户,管理员和分支机构。在用户表中,有一些用户具有管理员角色。每个管理员用户在AdminDetails表中都有一对一的映射关键字。使用实体名称为admin的User表中的自映射,使用1个管理员映射所有用户。 AdminDetails与Branch表具有多对一关系。
Bottomline,我的映射看起来像这样:
User (Many to One) > User as admin (One to one)> Admin Details (Many to one) > Branch
现在,我需要做的是找到特定分支下的所有用户。为此,我试图使用休眠标准功能。
方法1
我尝试使用映射直接添加限制。它适用于单级映射但不超过它。例如:
// This is working
Criteria userCriteria=session.createCriteria(User.class);
userCriteria.add(Restrictions.eq("admin.id",3));
// This is not
Criteria userCriteria=session.createCriteria(User.class);
userCriteria.add(Restrictions.eq("admin.adminDetails.id",3));
方法2
//我正在创建子标准并尝试对它们应用限制。
Criteria userCriteria=session.createCriteria(User.class);
Criteria adminCriteria=userCriteria.createCriteria("admin");
Criteria adminDetailsCriteria=adminCriteria.createCriteria("adminDetails");
Criteria branchCriteria=adminDetailsCriteria.createCriteria("branch");
branchCriteria.add(Restrictions.eq("id",1));
List<User> users=userCriteria.list();
这是抛出错误
No row with the given identifier exists:com.myapp.dao.AdminDetails#3
我最好的猜测是,并非所有用户都在AdminDetails表中包含一行。只有具有Admin角色的用户在那里包含一行,但是hibernate试图为每个用户找到导致上述错误的一行。
有没有其他方法可以获得理想的结果?或者我做错了什么?