通过HQL将对象列表转换为另一种类型

时间:2018-02-12 21:12:26

标签: hibernate spring-data-jpa hql

我有下一个持久化为db的类。

class User {
  private long id;

  @AttributeOverride(name = "id", column = @Column(name = "role_id"))
  @Embedded
  @ElementCollection
  private List<RoleId> roles;
}

class RoleId {
  private String id;
}

我希望得到这个课程的下一个投影。

class UserProjection {
  private long id;
  private List<String> roles;
}

List<String> roles是收集的RoleId.id用户列表。 为此,我编写了下一个HQL:

select new UserProjection(id, elements(roles)) from User where id = :id

当然,由于角色是RoleId对象,它不起作用。如何使用HQL将List<RoleId>转换为List<String>。有可能吗?

UPD:

所以,我认为这是不可能的,或者几乎不可能。而不是我使用CriteriaAPI。

1 个答案:

答案 0 :(得分:0)

您可以创建UserProjection的构造函数,然后从List<RoleId>转换为List<String>

查询应该是另一个(请参阅herehere):

select new ...UserProjection(u.id, u.roles) from User u join fetch u.roles where u.id = ?1

我认为您甚至可以尝试解决您的任务,例如here(未经测试):

public interface UserProjection {
    Long getId();
    @Value("#{target.roles.stream().map(RoleId::getId).collect(T(java.util.stream.Collectors).toList())}")
    List<String> getRoles();
}

然后在您的回购中使用此投影:

public interface UserRepo extends JpaRepository<User, Long> {

    List<UserProjection> getById(long id);
}

(如果有效,请通知我们。)

相关问题