gpt4 book ai didi

java - Spring data JPA @Query 与命名列的映射

转载 作者:行者123 更新时间:2023-12-01 17:52:02 25 4
gpt4 key购买 nike

我使用 Spring Boot 1.5 和 spring data 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 ,但是您需要将类路径硬编码到查询中才能使其正常工作,而且我仍然需要将对象映射到不可变对象(immutable对象)。

使用 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;
}
}

Spring Data 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 类中,您可以使用如下接口(interface)方法。

List<VehicleStats> objects = vehicleRepository.sourceModuleStats();
return objects.stream()
.map(o->SourceModuleStatDTO.from(getSourceModule(),getVehicleCount() )
.collect(Collectors.toList());

关于java - Spring data JPA @Query 与命名列的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49047878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com