java - Spring Data JPA 通过查询从实体获取投影
问题描述
在我的应用程序中,我有一个英雄实体。我还希望能够返回每个英雄 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;
}
解决方案
您必须使用字段别名来使 @Query 与投影一起工作:
@Query("select s.id as id, s.name as name from HEROES s")
别名必须与您的 HeroNameAndId 接口中的名称匹配。
推荐阅读
- python - 每次按 Enter 时如何从用户那里获取数据并将这些数据传递给函数?
- shell - 为什么 zsh `for` 循环错误并带有 `command not found: filename.txt`?尽管 filename.txt 是参数而不是命令
- python - 如果存在第二列,则填充第二列值,否则在 Dataframe 中填充第一列值
- core - Google 创始选择对 CLS 的影响
- ios - 未调用 URLSessionDelegate 类 deinit
- docker - Docker:“无法拉取‘tomcat:8.5’:清单列表条目中没有与 linux/arm/v7 匹配的清单”
- python - 在特定时间以毫秒精度运行函数
- reactjs - React Context:开发人员工具中的 Sessionstorage 数据出现,但在导航栏中显示为空白
- ruby-on-rails - 当 webpack-dev-server 运行时,Rails 看不到 webpack 编译的文件
- r - ggplot2图的问题