Hibernate Criteria:查找嵌套在列表中的属性

时间:2014-06-10 17:27:47

标签: java hibernate criteria-api

我尝试使用CriteriaBuilder构建以下查询:

SELECT * FROM job j, asset a, asset_users au
    where j.JOB_ID = a.ASSET_ID and a.ASSET_ID = au.ASSET_ID and au.USER_ID = 6

作业有资产,资产有用户列表...... 我想仅返回具有包含给定用户的资产的作业列表...

我看到有些人这样做:

Session session = this.sessionFactory.getCurrentSession();
Criteria criteria = session.createCriteria(Company.class);
criterion = Restrictions.eq("companyRoles.name", "ADMIN");
criteria.add(criterion);
List<Company> companyList = criteria.list();

试图将其复制到标准制定者但没有运气。我得到的只是它无法在对象列表(userList)中找到我的用户ID。猜猜我的例子更难,因为你必须像(job).asset.userList.id那样访问对象。 BTW,也试过这个:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Job> cq = cb.createQuery(Job.class);
Root<Job> jobRoot = cq.from(Job.class);
Join<Job, User> assetJoin = jobRoot.join("asset.userList");
cq.where(assetJoin.get("id").in(id));

得到同样的问题......无法找到路径。

非常感谢任何帮助! 感谢

1 个答案:

答案 0 :(得分:1)

我认为你错过了一步。你需要更高层次的加入。

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Job> cq = cb.createQuery(Job.class);
Root<Job> jobRoot = cq.from(Job.class);

// join the asset
Join<Job, Asset> assetJoin = jobRoot.join("asset");

// join the list of users
Join<Asset, User> assetUserJoin = assetJoin.join("userList");

cq.where(assetUserJoin.get("id").in(id));

assetUsrJoin.get("id")的类型为Path<Long>或类似内容。 JPA Criteria API