所以我有一个名为“用户”的表,其字段为
我想获取特定用户的主管的用户名。
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
Root<User> rootUser = criteriaQuery.from(User.class);
List<Predicate> predList = new ArrayList<Predicate>();
Join<User, User> selfJoin = rootUser.join("userId", JoinType.LEFT); //not sure about this line
predList.add(criteriaBuilder.equal(selfJoin.<String>get("userId"), supervisorId)); //supervisorId is the id of the supervisor that I want to find
TypedQuery<User> typedQuery = em.createQuery(criteriaQuery);
List<User> resultList = typedQuery.getResultList();
现在除了这个supervisorId之外我还有很多其他的条件。所以我必须使用相同的条件查询。
Thanks.
Criteria API 适用于您需要的时候动态构建查询 https://vladmihalcea.com/jpa-criteria-api-bulk-update-delete/,并且您应该始终记住它是基于遍历实体的。
你需要的是一个像这样的简单 SQL 查询:
select sp.userName
from users u
join users sp on sp.userId = u.supervisorId
where userId = ?
仅仅因为你使用JPA和Hibernate,这并不意味着您不应该使用 SQL 查询 https://vladmihalcea.com/the-jpa-entitymanager-createnativequery-is-a-magic-wand/.
Criteria API 查询可以相当容易地编写,如果您将主管映射为@ManyToOne协会 https://vladmihalcea.com/the-best-way-to-map-a-onetomany-association-with-jpa-and-hibernate/:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="supervisorId", referencedColumnName="userId")
private User supervisor;
那么,连接就变成:
Join<User, User> selfJoin = rootUser.join("supervisor", JoinType.LEFT);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)