【发布时间】:2020-10-02 12:45:42
【问题描述】:
我正在尝试从不同的表中选择 2 列(它们已连接),但我无法使用 Criteria API 使其工作。 问题是,我创建了一个 DTO 类作为 Projection,但我无法将连接的表实体转换为内部类。澄清一下,这是我的课程:
用户:
@Entity
@Table(name = "users", indexes = {@Index(columnList = "email", unique = true)})
public class User extends BaseEntity {
@Column(nullable = false)
private String firstName;
@ManyToMany
@JoinTable(name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id"))
private Set<Role> roles;
角色:
@Table(name = "roles")
@Entity
public class Role extends BaseEntity {
@Column(nullable = false)
private String name;
@Column(nullable = false)
private String description;
DTO 类:
public class UserRoleDto {
private String email;
private Set<RoleDto> roles;
public UserRoleDto(String email, Set<RoleDto> roles) {
this.email = email;
this.roles = roles;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Set<RoleDto> getRoles() {
return roles;
}
public void setRoles(Set<RoleDto> roles) {
this.roles = roles;
}
public static class RoleDto {
private String name;
public RoleDto(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
最后,我尝试了什么:
@Override
public Optional<UserRoleDto> findByIdWithRoles(UUID id) {
CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<UserRoleDto> query = builder.createQuery(UserRoleDto.class);
Root<User> root = query.from(User.class);
root.fetch("roles", JoinType.LEFT);
query.where(builder.equal(root.get("id"), id));
query.select(builder.construct(UserRoleDto.class, root.get("email"), root.join("roles")));
UserRoleDto user = entityManager.createQuery(query).getSingleResult();
return Optional.ofNullable(user);
}
如您所见,我只想查询 user.firstName 并从 Role 连接表中查询名称。如何在此处从 Role 转换为 UserRoleDto.RoleDto?
谢谢!
【问题讨论】:
标签: java spring hibernate jpa criteria-api