Spring Boot JPA @Query注解的一个BUG
发表于
|浏览量:
JPA的@Query注解在使用like关键字时且为复杂语句时存在截断后面SQL的BUG。具体如下。
BUG现象
@Query("select t from T t where t.name in (:names) and (t.dz like %:searchKey% or t.hjdz = :searchKey)") |
上面的两条语句,第二条执行正常,第一条会出现异常的返回结果,等同于
@Query("select t from T t where t.name in (:names) and (t.dz like %:searchKey% )") |
即,整个语句从like往后被截断。
解决方案
方案1:在参数传递过来前就把 %%号拼好,如 searchKey=”a” 改为 searchKey =”%a%” ,@Query中 like 去除%%。
@Query("select t from T t where t.name in (:names) and (t.dz like :searchKey or t.hjdz = :searchKey)")
方案2:使用concat代替like
@Query("select t from T t where t.name in (:names) and (t.dz like concat('%',:searchKey,'%') or t.hjdz = :searchKey)")
建议使用方案2,更加灵活,引入的变量更少。
END
文章作者: LeFer
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LeFer!
相关推荐
2020-07-09
WebFlux下的全局异常处理
Spring 5支持的WebFlux对于全局异常的捕捉与以前的WebMVC框架有了不同,不能靠@ControllerAdvice或@RestControllerAdvice打天下了。目前国内的资料比较少,而且语焉不详,下面我将处理方式分享出来,文末有我的项目代码供参考。 核心要点是要继承AbstractErrorWebExceptionHandler这个WebFlux下的全局异常处理类,然后重写getRoutingFunction。 需要注意的是AbstractErrorWebExceptionHandler中的构造方法中未对messageWriters进行初始化,源码如下: private List<HttpMessageWriter<?>> messageWriters = Collections.emptyList(); messageWriters是用于最终生成response body的,所以我们必须在实现类中对它进行初始化: public GlobalErrorWebExceptionHandler(ErrorAttributes err...
2017-07-31
Spring Boot添加静态资源目录
Hexo的好处很多,坏处之一就是图片的处理了。虽然可以在_post下创建静态资源目录,但我是把这个目录当作笔记目录,多了一些文件夹强迫症真的受不了。而第三方图床服务,总不能放心。刚好我的服务器上同时还有个jar在跑,目的是提供我的api,那么就通过这个去实现我自己的图床吧。 实现方式这个api.jar采用的是Spring Boot架构,虽然可以通过字节流去定义一个RESTful API提供图片服务,但觉得是高射炮打蚊子。还是直接增加一个外部资源目录,通过访问静态资源的方式去提供图片。本地通过ftp上传图片在这个目录。后续有必要的话,还可以建一个Git仓库,通过hooks转发到这个目录里去。 具体步骤增加一个配置类,继承WebMvcConfigurerAdapter类,并重写addResourceHandlers方法。 package com.lefer.bed;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.ann...
2018-07-12
覆盖 Spring Boot 配置项
Spring Boot中的配置项默认是在application.properties中。如: test.item=lefer 现在考虑两个场景: 场景1:不修改配置文件将test.item的值更改为另一个值 场景2:lefer 是一个密文,使用前需要做转换 下面说说这2个场景的实现方法。 通过命令行参数覆盖配置项场景1的实现非常简单,只要在启动时,指定对应参数就能覆盖配置项,比如: java -Dtest.item=orous -jar test.jar 这时 Spring Boot 会自动将该配置项的值替换成 orous 。更进一步,如果在命令参数里指定的参数在配置文件中不存在,那么等同于在配置文件中新增了一个配置项和对应值。之所以会出现这种现象,是Spring Boot的配置加载机制决定的,从官方文档可以看到,Spring Boot 加载配置项的顺序如下: home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)。 测试用例上的@TestPropertySource注...
2020-06-18
使用spring-boot-maven-plugin构建docker镜像
Spring Boot 2.3发布后带来了新特性之一就是对构建镜像的便捷支持,声称不用写dockerfile就能方便的构建docker image,最近刚好在写一个项目于是折腾了一下,只能说还不太适合国内用户,最终还是老老实实的写了dockerfile需要挂上代理才能勉强可用,下文记录折腾的过程。 更新 2020年6月19日尝试了诸如gcr.io的国内镜像、docker tag更改image的名字为原版gcr.io/等其他几种办法之后,发现只有挂全局代理才可以走通。 Windows下可以使用Proxifier设置全局代理,Proxifier的使用比较简单,网上说的比较多,如这一篇。 全局代理设置好,一切都OK了,如果走代理下载镜像比较慢,可以先把镜像从国内镜像源里拉到本地。然后再改Tag的名字,这样能跳过下载镜像的环节。 docker pull registry.cn-hangzhou.aliyuncs.com/lefer/paketo-buildpacks:0.3# docker tag imageid tag:versiondocker tag 87c89aeacd...
2018-06-27
JPA在sqlserver2008下缺少sys.sequences的解决办法
目前在一个使用Spring Boot 2.0.2框架的工程里,使用jpa配合sqlserver2008,启动时直接报错”找不到sys.sequeces”对象。 经过跟踪代码,发现jpa对于数据库的版本识别出了问题。 定位到问题后,查找解决办法。查阅jpa的配置参数spring.jpa.database-platform能用来指定数据库版本。 在application.properties文件中,配置 spring.jpa.database-platform=org.hibernate.dialect.SQLServer2008Dialect 问题解决!
2017-08-22
JPA关键词
JPA相较Hibernate来说,比较优秀的一点就是实现了根据方法名的自动解析创建查询。今天看到团队的小伙伴无论查询复杂或简单还在吭哧吭哧的写@Query,于是决定把JPA的能自动解析的关键词扒出来。供大家参考。 简单示例public interface UserRepository extends JPARepository<User, Long> { List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);} 以上就是一个简单的查询的示例。当继承了JPARepository接口之后,JPA就会尝试根据方法名去自动生成sql,上面的方法会被解析成 select u from User u where u.emailAddress = ?1 and u.lastname = ?2 JPARepository<User, Long> ,第一个参数是对应的实体类,第二个参数是这个实体类的主键的数据类型。根据需要修改。 ...
评论
公告
不见五陵豪杰墓,无花无酒锄作田!
