同样的sql语句,在数据库中能查出完整的行数据
在mybatis中返回数据中能查出行,但是部分有值的字段为空。
首先检查缓存,没问题的话大概率是因为mybatis自动映射的关系:
1.列名不匹配:自动映射会根据数据库中的列名和对象属性名进行映射,如果列名和属性名不匹配,就会导致数据为空。确保数据库列名与对象属性名一致,或者通过 @Results 注解或 @ResultMap 注解显式指定列名与属性的对应关系。
2.主键映射错误:如果对象有主键字段,自动映射会尝试根据名称匹配进行映射,但有时名称不匹配会导致主键数据为空。在这种情况下,可以使用 @Id 注解明确指定主键字段,并使用 @GeneratedValue 注解来生成主键值。
3.枚举类型映射错误:如果数据库中的列是枚举类型,而自动映射未能正确映射枚举值,会导致数据为空。在这种情况下,可以使用 @TypeHandler 注解为枚举类型指定一个自定义类型处理器。
4.类型转换错误:数据库中的列类型与 Java 对象属性的类型不匹配,自动映射会尝试进行类型转换。如果类型转换失败,会导致数据为空。可以通过自定义类型处理器来处理数据库列与属性之间的类型转换,以确保正确映射。
首先查看你的命名是否规范,当然,可能因为业务或者权限关系你不能修改。
我们可以通过手写resultMap来解决:
注意红框,默认的是resultType需要改为resultMap,type就是实体类。
column是查出来的字段名,property实体类名。
另外还可以通过注解来映射:
@Results 注解:
在查询方法上使用 @Results 注解,指定多个 @Result 注解来定义列名与属性的对应关系。示例代码如下:
java
复制代码
@Results({
@Result(column = "column_name1", property = "propertyName1"),
@Result(column = "column_name2", property = "propertyName2")
})
@Select("SELECT column_name1, column_name2 FROM your_table")
YourObject selectData();
注意,@Results 注解需要和 @ResultMap 注解或 @ResultType 注解一起使用,如果只使用 @Results 注解是不会产生效果的。
@ResultMap 注解:
首先,定义一个 resultMap,其中通过 @Result 注解指定列名与属性的对应关系。示例代码如下:
1.@Results 注解:
在查询方法上使用 @Results 注解,指定多个 @Result 注解来定义列名与属性的对应关系。示例代码如下:
java
复制代码
@Results({
@Result(column = "column_name1", property = "propertyName1"),
@Result(column = "column_name2", property = "propertyName2")
})
@Select("SELECT column_name1, column_name2 FROM your_table")
YourObject selectData();
注意,@Results 注解需要和 @ResultMap 注解或 @ResultType 注解一起使用,如果只使用 @Results 注解是不会产生效果的。
2.@ResultMap 注解:
首先,定义一个 resultMap,其中通过 @Result 注解指定列名与属性的对应关系。示例代码如下:
@Results(id = "yourObjectMap", value = {
@Result(column = "column_name1", property = "propertyName1"),
@Result(column = "column_name2", property = "propertyName2")
})
YourObject resultMap();
然后,在查询方法上使用 @ResultMap 注解,引用之前定义的 resultMap。示例代码如下:
@ResultMap("yourObjectMap")
@Select("SELECT column_name1, column_name2 FROM your_table")
YourObject selectData();