我一直在遗留项目中工作,它有几个这样的存储库方法:
@Query(value = "SELECT "
+ " i.uf, "
+ " i.cidade "
+ "FROM Imovel AS i "
+ "WHERE i.ativo = 'Sim' AND "
+ " EXISTS (SELECT 1 "
+ " FROM ImovelFoto AS f "
+ " WHERE f.codigoImovel = i.codigo)"
+ "GROUP BY i.uf, i.cidade", nativeQuery = true)
List<Object[]> findUFCidade();
我想将其更改为这样的对象:
public class LocalizacaoAgrupadaDTO {
private String uf;
private String cidade;
// Getters e Setters omitidos
}
This answer建议更改nativeQuery
的{{1}}。
然而,由于语法和实体映射不同,这种变化增加了额外的复杂性,因为这个select子句是一个与实体没有直接关系的小组。
重构使用Spring Data JPA的最佳方法是什么?
我应该总是尝试使用JPQL还是可以使用nativeQuery?
答案 0 :(得分:1)
使用Spring Data JPA实际上没有“最好”的方法来重构它。您可以选择一系列选项。
我认为最“理想”/现代的选择虽然可能是最耗费时间,但却转而使用正确映射的对象和JPQL。
您的结果本身不需要是SELECT new LocalizacaoAgrupadaDTO(e.uf, e.cidade) FROM EntityObject e ...<rest of JPQL query
对象,您可以使用{{1}}之类的语法将查询结果作为特定的DTO类型返回。
答案 1 :(得分:0)
创建custom repository,然后使用ResultTransformer。
你需要从EntityManager here a example获取来自休眠的对象Session。