【问题标题】:Convert List of Objects to another type by HQL通过 HQL 将对象列表转换为另一种类型
【发布时间】:2018-02-12 21:12:25
【问题描述】:

我有一个持久化到数据库的下一个类。

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&lt;String&gt; roles 是收集的用户RoleId.id 列表。 为此,我编写了下一个 HQL:

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

当然它不起作用,因为角色是 RoleId 对象。如何使用 HQL 将 List&lt;RoleId&gt; 转换为 List&lt;String&gt;。有可能吗?

UPD:

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

【问题讨论】:

    标签: hibernate spring-data-jpa hql


    【解决方案1】:

    您可以创建UserProjection 的构造函数,并在那里将List&lt;RoleId&gt; 转换为List&lt;String&gt;

    查询应该有点不同(参见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();
    }
    

    然后在你的 repo 中使用这个投影:

    public interface UserRepo extends JpaRepository<User, Long> {
    
        List<UserProjection> getById(long id);
    }
    

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

    【讨论】:

    • 谢谢,但它不起作用。我决定改用 CriteriaAPI。
    • @OlegP。哪个变体不起作用?第一个必须以任何方式工作......(你看到this了吗?)
    • @OlegP。 “必须工作..”更正:from User u join fetch u.roles(我更新了答案)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    相关资源
    最近更新 更多