jpa 如何优雅的实现动态sql

spring boot + jpa 的项目开发起来很快很舒服(至少开发起来是这样),从开发的角度来说(小公司没有数据库维护人员),基于注解的查询方式是最快并且最方便的.但是:

jpa竟然不支持动态sql,要知道,java的强大在于处理复杂的业务逻辑,后台系统一般java开发的居多,不支持动态sql感觉像断了条手一般的无奈.
so,我想向大神们请教,jpa有没有可能,在自己封装一层的情况下,优雅的实现动态sql,目前已知的有:
1:自定义注解,配合拦截器实现:http://gogs.daikun.xin:3000/d...优点:完全自定义,灵活性高,且完全保留所有的jpa原生提供的接口,例如:JpaRepository等,缺点:aop 大量使用反射,性能可能偏低(这都是虚的),这个思路是我自己写的,安全性,以及可靠性,说实话,我是不敢用,尽管demo测试通过.
2:覆写jpa的接口,并新加支持动态sql的接口,利用SimpleJpaRepository实现部分原生的接口,并对动态sql提供支持,优点:原生的写法,支持动态sql,缺点:如果sql定义不放在dao层,则破坏mvc设计模式,放在dao层,我感觉这就是一个工具类,类还是要那么多,怎么快?.由于是覆写?新用到的jpa接口也要覆写(当然,不会用到太多),但是不想jpa那样继承就可以帮我实现.

我知道的就是以上几种,感觉都不是很优雅,我相信肯定有更优雅的实现方式,求大神指教.
感谢

阅读 21.5k
4 个回答

CriteriaQuery 的api可以很好的实现动态查询呀。

你给的网址打不开。你是说jpa repository?可以直接写在JpaRepository的interface里

@Query("select * from abc")
public List<Abc> selectAll();

或者自己创建一个interface - AbcRepositoryCustom,AbcRepository extends AbcRepositotyCustom, class AbcRepositoryImpl implements AbcRepositoryCustom。逻辑写在AbcRepositoryImpl里。

复杂查询可以使用QueryDSL,或者spring-data-jap的Specification

jpa的作用就是让你对数据库的操作更加的“面向对象”,更加易于维护。sql可读性查,难以维护。所以复杂的业务应该是写在对应的领域模型里,而不是SQL里,我并不认为动态SQL“优雅”

新手上路,请多包涵

简单的可以直接用jpa的解析规则在继承jpa的几口里自定义查询方法,复杂的用@Query手写sql,代码量都很少,不过也有点违背mvc

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题