spring报错"No property ... found for type..."

本文详细解析了SpringDataJPA中实体属性命名与数据库字段不匹配导致的问题,特别是驼峰命名规则与下划线的冲突,以及如何通过正确命名和使用@Column注解来解决这一常见错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

遇到很多次这个问题了,可能正是因为没有写一篇博客,才导致我一直踩坑.

这个问题的原因,我遇到的只有一个,就是Spring Data JPA的Entity实体没有对应好,具体怎么说呢

这样,我遇到的问题是这样,我的数据库中的字段是publish_time,然后为了偷懒,在JavaBean中,我

直接就把对应的属性名写作publish_time(因为不用写@column),然后在Repository接口中的基于

方法名字查询的一些方法(例如:getByName)就无法使用,因为这些方法是JPA仅仅根据方法名而

自行实现的方法,所以,方法名就尤为重要,它有一些规则,我没有看源码,但从我的测试中来看,这个

方法名不能带"_",必须使用驼峰命名,对于的问题,我把JavaBean中的属性名改为PublishTime,

然后加上了@column就可以了,可能你不使用基于方法名字的查询也会有这样的报错,我建议

查看一下你的JavaBean的属性名,还有一点,如果你在已有的JavaBean的基础上改代码,记得一定要

把对应的getter/setter也修改.

非常抱歉,这是由于MyBatis无法自动映射 `List<String>` 类型的属性。为了解决这个问题,我们需要自定义一个TypeHandler来处理这种情况。下面是修改后的代码: 首先,创建一个自定义的TypeHandler类 `StringListTypeHandler`,用于处理 `List<String>` 类型的属性: ```java import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Arrays; import java.util.List; public class StringListTypeHandler extends BaseTypeHandler<List<String>> { private static final String DELIMITER = ","; @Override public void setNonNullParameter(PreparedStatement ps, int i, List<String> parameter, JdbcType jdbcType) throws SQLException { String value = String.join(DELIMITER, parameter); ps.setString(i, value); } @Override public List<String> getNullableResult(ResultSet rs, String columnName) throws SQLException { String value = rs.getString(columnName); return Arrays.asList(value.split(DELIMITER)); } @Override public List<String> getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String value = rs.getString(columnIndex); return Arrays.asList(value.split(DELIMITER)); } @Override public List<String> getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String value = cs.getString(columnIndex); return Arrays.asList(value.split(DELIMITER)); } } ``` 接下来,在 `PinDataMapper.xml` 文件中为 `getDistinctValues` 配置TypeHandler: ```xml <select id="getDistinctValues" resultMap="PinResultMap"> SELECT DISTINCT #{column} AS value FROM your_table_name </select> <resultMap id="PinResultMap" type="java.lang.String"> <id column="value" property="value" jdbcType="VARCHAR" javaType="java.lang.String" typeHandler="com.example.typehandler.StringListTypeHandler"/> </resultMap> ``` 然后,在 `PinDataMapper` 接口中添加对应的方法: ```java @Select("SELECT DISTINCT ${column} FROM your_table_name") @Result(column = "value", property = "value", jdbcType = JdbcType.VARCHAR, javaType = String.class, typeHandler = StringListTypeHandler.class) List<String> getDistinctValues(@Param("column") String column); ``` 最后,确保在你的 Spring Boot 主类上添加 `@MapperScan` 注解,指定扫描 `PinDataMapper` 接口所在的包: ```java @SpringBootApplication @MapperScan("com.example.mapper") public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } } ``` 重新运行应用程序,这样应该就能够正确地获取每个字段去重后的结果并返回给前端了。 希望这次能够解决你的问题。如果还有其他问题,请随时提出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值