Spring Data JPA 通过查询从实体获取投影

Posted

技术标签:

【中文标题】Spring Data JPA 通过查询从实体获取投影【英文标题】:Spring Data JPA getting a Projection from an Entity with a Query 【发布时间】:2019-01-07 14:13:55 【问题描述】:

在我的应用程序中,我有一个英雄实体。我还希望能够返回每个英雄 id 和名称的列表。我得到了它的工作:

@Repository
public interface HeroEntityRepository extends JpaRepository<HeroEntity, Long> 
@Query("select s.id, s.name from HEROES s")
List<Object> getIdAndName();


// in controller:
@GetMapping
public List<Object> getHeroNames() 
    return heroEntityRepository.getIdAndName();

我在另一篇文章中尝试了用接口替换对象的建议,但随后我收到了一个空值列表( ["name":null,"id":null,"name":null, "id":null, // 等等)。 自定义接口:

public interface HeroNameAndId 

    Long getId();
    String getName();

在创建只有 id 和 name 值的实体时,我收到了“ConverterNotFoundException”。我不确定正确的方法是什么。我让它与 Object 一起工作,但这似乎不是很干净。

我的英雄实体:

@Getter
@Builder
@Entity(name = "HEROES")
@AllArgsConstructor
public class HeroEntity extends HasId<Long> 

    private String name;
    private String shortName;
    private String attributeId;

    @ElementCollection private List<String> translations;

    @OneToOne(cascade = CascadeType.ALL) private HeroIconEntity icon;

    private String role;
    private String type;
    private String releaseDate;

    @OneToMany(cascade = CascadeType.ALL) private List<AbilityEntity> abilities;

    @OneToMany(cascade = CascadeType.ALL) private List<TalentEntity> talents;


@MappedSuperclass
public abstract class HasId<T> 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Setter
    @Getter
    private T id;

【问题讨论】:

在你介绍了Interface(它被称为Projection)之后。您是否以任何方式更改了您的存储库方法?如果是这样,你改变了什么? 不,我只是在方法中用 Object 替换了 HeroNameAndId 接口(例如 List getHeroNames() )。 您必须将存储库方法从 List&lt;Object&gt; getIdAndName(); 更改为 Collection&lt;HeroNameAndId&gt; getIdAndName(); 【参考方案1】:

您必须使用字段别名来使 @Query 与投影一起工作:

@Query("select s.id as id, s.name as name from HEROES s")

别名必须与您的 HeroNameAndId 接口中的名称匹配。

【讨论】:

像魅力一样工作!谢谢! 我仍然没有得到接口,而是一个具有指定值的对象。有什么想法吗? @SimonMartinelli 你知道这是为什么吗?我有一个带有投影的查询,没有别名在 Boot 1 中工作正常。我已经升级了,这对我来说坏了,迫使我添加别名。我在 Spring Data JPA 的更新日志中没有找到任何内容。 对不起,没有。 嗨,Simon,您能告诉我们,@query 是否支持 DB 独立性

以上是关于Spring Data JPA 通过查询从实体获取投影的主要内容,如果未能解决你的问题,请参考以下文章

Spring Data JPA 查询结果返回至自定义实体

Spring Data JPA:查询如何返回非实体对象或对象列表?

用于在 Spring Data Jpa 中从多个表中获取数据的自定义查询

Spring Data JPA Repository:如何有条件地获取子实体

Spring Data JPA:通过示例查询?

Spring Data JPA:创建规范查询获取连接