springboot +JPA自定义查询返回部分字段的返回值类型,用Integer类型作为模糊查询的条件

本文记录了在SpringBoot 2.1.1环境下,使用JPA进行数据库表sid字段模糊查询的过程。从最初尝试使用JPA命名查询方法遇到类型不匹配的问题,到最终采用自定义SQL查询并调整返回类型为List<Map<String,Object>>成功解决问题的经历。

今天遇到一个问题记录下来。
使用的是springboot 2.1.1
jpa连接MySQL数据库
数据库表:
在这里插入图片描述
我想通过sid的模糊查询来生成下拉列表。
开始想用jpa提供的一种方法名称查询,于是在dao中定义了public List findBySidLike(Integer sid) 方法
但是Integer类型的参数不能在前后添加百分号。把参数改成String类型jpa还不同意,说找不到String类型的sid。郁闷~

后来使用自定义的SQL查询语句
@Query(value=“select sid,sname,clazz,……from subject where sid like concat(’%’,?1,’%’)”)
public List myFunction(String sid)
这样,参数终于可以拼接了。
但是还有问题,报错说结果集某某类型(jpa返回的类型)不能转换为List(我要求返回的类型)。
于是又到网上查,说是要再定义一个类来接受结果等等,没看懂。
后来终于看到不知是哪位大神的记录,说类似这样的查询返回的是List<Map<String,Object>>或List<List>

List<Map<String,Object>>
[
	{
		"1":a,
		"2":b,
		"3":c
	},
	{
		"1":a,
		"2":b,
		"3":c
	},
	{
		"1":a,
		"2":b,
		"3":c
	}
]

List<List<Object>>
[
	[a.b.c],
	[a.b.c],
	[a.b.c]
]

于是将返回值类型改为List<Map<String,Object>>
终于成功。

在Spring Boot项目中,定义类属性时使用Java包装对象类型而非基本类型,主要有以下原因: 1. **支持null值**:基本类型(如int、boolean等)不能为null,而包装对象类型(如Integer、Boolean等)可以。在实际开发中,某些属性可能在特定情况下没有值,使用包装对象类型可以更准确地表示这种状态。例如,在数据库查询中,某些字段可能允许为空,使用包装对象类型可以直接映射这些可能为空的数据,避免了基本类型默认值(如int的默认值为0)带来的歧义。 2. **泛型和集合的使用**:Java的泛型和集合框架要求使用对象类型,不能使用基本类型。在Spring Boot项目中,经常会使用到泛型集合(如List、Map等)来处理数据,如果要将基本类型的数据存储在这些集合中,就需要使用对应的包装对象类型。 3. **序列化和反序列化**:在进行数据的序列化和反序列化时,包装对象类型可以更方便地处理null值。例如,在将Java对象转换为JSON格式时,如果使用基本类型,当属性没有赋值时,会使用默认值,而使用包装对象类型可以准确地表示为null。这在前后端数据交互中非常重要,能够避免数据不一致的问题。 4. **方法参数和返回值**:在定义方法时,使用包装对象类型作为参数和返回值可以提供更灵活的处理方式。调用者可以根据需要传入null值,方法也可以返回null表示特定的状态或结果。 5. **与框架和库的兼容性**:许多Spring Boot的框架和库在处理数据时更倾向于使用包装对象类型。例如,在Spring Data JPA中,使用包装对象类型可以更好地处理数据库中的空值,避免不必要的错误。 ### 代码示例 ```java import java.util.ArrayList; import java.util.List; public class ExampleClass { // 使用包装对象类型 private Integer age; private Boolean isStudent; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Boolean getIsStudent() { return isStudent; } public void setIsStudent(Boolean isStudent) { this.isStudent = isStudent; } public static void main(String[] args) { List<Integer> numbers = new ArrayList<>(); numbers.add(null); // 可以添加null值 System.out.println(numbers); } } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值