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

问题描述 投票:0回答:1

我有下一个持久化为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。

hibernate spring-data-jpa hql
1个回答
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);
}

(如果有效,请告诉我们..)

© www.soinside.com 2019 - 2024. All rights reserved.