我如何解决这个Hibernate JPA查询?



我正在尝试用criteribuilder构建一个查询。

对象结构是这样的用户→有一个名为"userroles"的列表…userRoles包含UserRoleEntity类的对象。

每个UserRoleEntity有一个RoleEntity。

每个RoleEntity都有一个名称;

所以我现在的查询:

ListJoin<UserEntity, UserRoleEntity> userRoles = user.joinList("userRoles", JoinType.INNER);
predicates.add(userRoles.get("role").<RoleEntity> get("name").in("abc"));

但是它不工作…有什么建议吗?

谢谢。

根据代码片段,很难确定错误的确切原因。

但是,假设这些实体
@Entity
@Table(name="t_user")
public class UserEntity {
@Id
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
List<UserRoleEntity> userRoles;
//...
}

@Entity
@Table(name="t_user_role")
public class UserRoleEntity {
@Id
@Column(name="id")
private Integer id;
@ManyToOne
private UserEntity user;
@OneToOne
@JoinColumn(name = "role_id")
private RoleEntity role;
//...
}
@Entity
@Table(name="t_role")
public class RoleEntity {
@Id
@Column(name="id")
private Integer id;
@Column(name="name")
private String name;
//...
}

在自定义存储库

上使用以下方法
List<UserEntity> findUserByRoleName(String roleName) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<UserEntity> cq = cb.createQuery(UserEntity.class);
Root<UserEntity> root = cq.from(UserEntity.class);
Join<Object, Object> joinUserRole = root.join("userRoles");
Join<Object, Object> joinRole = joinUserRole.join("role");
Predicate predicateRoleName = cb.equal(joinRole.get("name"), roleName);
cq.where(predicateRoleName);
TypedQuery<UserEntity> query = entityManager.createQuery(cq);
return query.getResultList();
}

生成所需的查询:

select userentity0_.id as id1_2_, userentity0_.name as name2_2_
from t_user userentity0_
inner join t_user_role userroles1_ on userentity0_.id=userroles1_.user_id
inner join t_role roleentity2_ on userroles1_.role_id=roleentity2_.id
where roleentity2_.name=?

最新更新