这是我的实体类
public record User(Integer id, String email, String password, String nickname, Integer is_active) {
}
这是 mapper 的查询语句
@Select("select email,nickname from user where email = #{email} limit 1")
User findUserByEmail(@Param("email") String email);
现在情况是我如果查询的字段不用*或者写完所有的字段,都会报错
org.springframework.dao.DataIntegrityViolationException: Error attempting to get column 'email' from result set. Cause: java.sql.SQLDataException: Cannot determine value type from string 'XXX'
; Cannot determine value type from string 'XXX'
我的数据库表结构的字段和里面的值都是正确的,所以不存在数据库的错误
@Terminator0826
public record User(Integer id, String email, String password, String nickname, Integer is_active) {
public User(String email, String nickname, Integer is_active) {
this(null, email, null, nickname, is_active);
}
}
我现在添加了个这个构造器,但是返回的结果就是
"data": {
"id": null,
"email": "XXX",
"password": null,
"nickname": "XXX",
"is_active": 0
}
id 和 password 还是查出来了
1
Terminator0826 2023-03-11 23:32:24 +08:00 via Android
我猜应该是因为你写了全仓构造限制了他,因为你只差部分字段,试下把全仓改掉或者再定一个你要查询字段的构造函数
|
2
Terminator0826 2023-03-11 23:34:16 +08:00 via Android
@Terminator0826 妈耶这错别字😅 差->查, 改掉-> 干掉
|
3
oneisall8955 2023-03-11 23:35:15 +08:00
盲猜 record 原因,你再缕清楚 record 的特性
|
4
shayang888 OP @oneisall8955 并不是 我去掉 record ,换回普通的 class 也是一样的结果
|
5
shayang888 OP @oneisall8955 record 只是帮忙补全了 gettersetter 无参构造器已经类变成 final 而已
|
6
shayang888 OP @Terminator0826 确实 如果设置了构造函数,可以正常查出来,但是对于我没查询的字段它还是会在数据里返回,只是值为 null 。关键是我压根就不想要那个字段在结果里
|
7
shayang888 OP @Terminator0826
public record User(Integer id, String email, String password, String nickname, Integer is_active) { public User(String email, String nickname, Integer is_active) { this(null, email, null, nickname, is_active); } } 我现在添加了个这个构造器,但是返回的结果就是 "data": { "id": null, "email": "XXX", "password": null, "nickname": "XXX", "is_active": 0 } id 和 password 还是查出来了 |
8
tairan2006 2023-03-12 00:14:38 +08:00 via Android
你不想要多余的字段就把返回值改成其他 DTO ,或者用 Map 啊…
|
9
shayang888 OP @tairan2006 确实可以这么整,就是觉得有点麻烦
|
10
Terminator0826 2023-03-12 00:37:55 +08:00 via Android
@shayang888 大哥呀,按照规范,本来就不建议将表实体直接放回前端的。可以另外定一个 dto 映射返回,或者在查询时指明 SQL 结果封装到某个 dto 也行。当然非要用 user 返回但是想排除 null 还是有办法的,可以全局配置一下或者在实体类上用 spring 提供的注解过滤 null 字段返回,这个你可以查查资料
|
11
Leviathann 2023-03-12 00:42:11 +08:00
null 字段不序列化?那不是配 jackson 就行了?
|
12
shayang888 OP @Terminator0826 谢谢老哥 搞定了
|
13
zed1018 2023-03-12 09:27:38 +08:00
这个难道不是应该用 projections 吗,单独定义个 XXXXOnly 的 interface 用这个 interface 去查询
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections |
14
xcccer 2023-03-12 22:28:48 +08:00
我猜你是想屏蔽掉 password 这个字段,如果你用的 jackson 框架你可以试试 @JsonIgnore ,或者就像楼上说的写个 DTO 。
|
15
dif 2023-03-13 09:27:32 +08:00
@JsonIgnore 与 @Transient 应该都能满足
|