Spring数据JPA @Query映射与命名列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring数据JPA @Query映射与命名列相关的知识,希望对你有一定的参考价值。
我使用Spring Boot 1.5和Spring数据JPA和mysql。我试图在一个表上运行一个简单的计数查询,但找不到更好的方法来映射查询结果比这个:
库:
public interface VehicleRepository extends JpaRepository<Vehicle, String> {
@Query("select v.sourceModule as sourceModule, count(v) as vehicleCount from Vehicle v group by v.sourceModule")
List<Object[]> sourceModuleStats();
}
服务:
@Override
public List<SourceModuleStatDTO> getSourceModuleStats() {
List<Object[]> objects = vehicleRepository.sourceModuleStats();
return objects.stream()
.map(o->SourceModuleStatDTO.from((String)o[0], (Long)o[1]))
.collect(Collectors.toList());
}
我使用org.immutables,所以DTO:
@Value.Immutable
@JsonSerialize(as = ImmutableSourceModuleStatDTO.class)
@JsonDeserialize(as = ImmutableSourceModuleStatDTO.class)
public abstract class SourceModuleStatDTO {
public abstract String sourceModule();
public abstract long vehicleCount();
public static SourceModuleStatDTO from(String sm, long c) {
return ImmutableSourceModuleStatDTO.builder()
.sourceModule(sm)
.vehicleCount(c)
.build();
}
}
这里的问题是映射,我需要转换结果或手动检查所有内容。即使JdbcTemplate
有更好的映射功能,我也不敢相信没有更好的方法来做到这一点。
我也尝试了这个:https://stackoverflow.com/a/36329166/840315,但你需要将类路径硬编码到Query中以使其工作,我仍然需要将对象映射到Immutables。
使用JdbcTemplate,您可以使用RowMapper
(src):
private static final class EmployeeMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setCountry(rs.getString("country"));
employee.setEmployeeName(rs.getString("employee"));
return employee;
}
}
春季数据JPA @Query
有类似的东西吗?
答案
如何使用Projections如下?
static interface VehicleStats {
public String getSourceModule();
public Long getVehicleCount();
}
你的存储库方法就是
@Query("select v.sourceModule as sourceModule, count(v) as vehicleCount from Vehicle v group by v.sourceModule")
List<VehicleStats> sourceModuleStats();
在Service类中,您可以使用如下的接口方法。
List<VehicleStats> objects = vehicleRepository.sourceModuleStats();
return objects.stream()
.map(o->SourceModuleStatDTO.from(getSourceModule(),getVehicleCount() )
.collect(Collectors.toList());
以上是关于Spring数据JPA @Query映射与命名列的主要内容,如果未能解决你的问题,请参考以下文章
Spring Data JPA - 带有“@Param Date”的自定义@Query 不起作用
Spring Data JPA 将原生查询结果映射到非实体 POJO