Spring Boot Native Query编写求助:按条件查询ClinicalData
问题分析与修复方案
你的原生查询存在两个核心问题:
- 查询条件写死了
patient_id=1和name='bp',完全没有使用方法传入的patientId和name参数,导致无论接口传什么值,都会查询固定条件的数据 - 方法名包含
OrderByMeasuredDateTime,但查询语句里没有添加排序逻辑,不符合方法的语义要求
修复后的代码
方式1:使用命名参数绑定(更清晰)
@Query(value = "SELECT id, name, value, measured_date_time FROM clinicaldata " + "WHERE patient_id = :patientId AND name = :name " + "ORDER BY measured_date_time", nativeQuery = true) List<ClinicalData> findByPatientIdAndNameOrderByMeasuredDateTime(@Param("patientId") int patientId, @Param("name") String name);
方式2:使用位置参数绑定
@Query(value = "SELECT id, name, value, measured_date_time FROM clinicaldata " + "WHERE patient_id = ?1 AND name = ?2 " + "ORDER BY measured_date_time", nativeQuery = true) List<ClinicalData> findByPatientIdAndNameOrderByMeasuredDateTime(int patientId, String name);
关键说明
- 参数绑定:通过
:参数名(需配合@Param注解)或?索引的方式,把方法参数动态传入SQL,避免写死条件 - 排序逻辑:添加
ORDER BY measured_date_time子句,匹配方法名中OrderByMeasuredDateTime的要求,确保返回结果按测量时间排序 - 字段匹配:确保SQL查询的字段和
ClinicalData实体类的属性一一对应,比如measured_date_time要对应实体类里的measuredDateTime属性(如果开启了驼峰转下划线的自动映射配置则无需额外处理)
内容的提问来源于stack exchange,提问作者Candide Mboungou-Kimpolo
相关产品推荐
相关产品推荐

