当前位置: 首页 > 知识库问答 >
问题:

带有命名列的Spring data JPA@Query映射

温镜
2023-03-14
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());
}
@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,但您需要将类路径硬编码到查询中以使其工作,而且我仍然需要将对象映射到不可变的对象。

使用JdbcTemplate,您可以使用行映射器(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是否有类似的内容?

共有1个答案

水麒
2023-03-14

用下面的预测怎么样?

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();

在您的服务类中,您可以使用如下所示的接口方法。

List<VehicleStats> objects = vehicleRepository.sourceModuleStats();
return objects.stream()
        .map(o->SourceModuleStatDTO.from(getSourceModule(),getVehicleCount() )
        .collect(Collectors.toList());
 类似资料:
  • 我有一个带有两个字段的简单Person实体: 一个JpaRepository,我在其中重写findAll方法以根据用户角色限制记录: 上述设置工作正常。但当我将查询更新为以下内容时,它会抛出如下异常。似乎无法解析SpEL表达式。 有问题的查询: 例外: 我尝试了以下选项,但得到了相同的例外: 1)用=替换赞 2) 设置硬编码 ID: 有什么建议吗? 仅供参考: 我有Spring的靴子1.3.6.R

  • 我有不同实现的< code>ProductHandler类,例如< code>ABCProductHandler、< code>DEFProductHandler等..它们是使用如下所示的命令模式从< code>ProductServiceImpl类调用的。 产品ServiceImpl类: 但是,我对上面的 类不满意,因为有很多带有样板代码的产品 调用。 现在,我的问题是,有什么方法可以轻松加载?

  • 问题内容: 我目前有以下环绕存储过程的命名查询:- 列和是存储过程返回的确切列名。我创建了一个包含相同列名的bean,以便可以将查询的结果映射到该bean中。 调用命名查询并将结果映射到Bean的Hibernate代码: 所有这些都可以正常工作,但是我不想依赖存储过程中的列名,而是想在中使用自己的列名,例如: 如何在上面的命名查询中将列名与存储过程的列相对应? 谢谢。 更新 -我在下面添加了最终解

  • 我试图在CrudRepository中创建一个方法,它将能够给出用户列表,这些用户的用户名就像输入参数一样(不仅以它开头,而且包含它)。我尝试使用方法,但正如Spring文档中所述,该方法等于“”。这对我不利,因为我已经告诉我,我正在尝试获取所有用户的用户名包含...

  • 我正在尝试用dataframe.from_dict操作命名新dataframe的列。

  • 问题内容: 无论如何,我可以在现有的Elasticsearch映射中重命名元素而不必添加新元素?如果是这样,为了避免破坏现有映射,最好的方法是什么? 例如从fieldCamelcase到fieldCamelCase 问题答案: 您可以通过创建一个Ingest管道来做到这一点,该管道包含一个Rename Processor 和Reindex API 。 请注意,您需要运行Elasticsearch