最近在使用JPA做项目,虽然JPA使用起来比mybatis方便,但是涉及到多表关联查询的时候就麻烦,往往需要自己写SQL语句。但是如果查询的时候条件不确定,比如说:查询员工可以通过工号或者姓名来查询。我们不知道他要通过工号还是姓名,或者两个条件都要,又或者什么条件都不要,但是要查询全部信息。
通过MySQL数据库的 if 判断 可以完美解决这个问题,以下就是例子,当传入的工号或者姓名为空时,就选择1=1,条件成立,查询全部。如果传入的参数不为空,则按着参数的值进行匹配。以下是代码。备注:?1 代表方法的参数列表第一个参数。以此类推,?2 就是第二个参数,同时也可以通过@param(“xxx”)来指定参数,使用的时候把 ?1 改成 :xxx 。
普通查询
//查询员工
@Query(value = "SELECT * FROM emp " +
"WHERE if(?1= '' OR ?1 is null ,1=1, code like %?1%) " +
" AND if(?2= '' OR ?2 is null ,1=1, `name` like %?2%) " ,
nativeQuery = true)
List<Map> findEmp( String code, String name);
带分页查询 (备注:不带分组GROUP BY )
如果需要带分页的话,需要传入JPA的分页对象 Pageable,需要两段SQL,一个SQL用于查询数据,一个SQL用于查询总记录数,要在@Query的countQuery注入查询总记录数的SQL,代码如下。
//查询员工
@Query(value = "SELECT * FROM emp " +
"WHERE if(?1= '' OR ?1 is null ,1=1, code like %?1%) " +
" AND if(?2= '' OR ?2 is null ,1=1, `name` like %?2%) " ,
countQuery = "SELECT count(*) FROM emp "+
"WHERE if(?1= '' OR ?1 is null ,1=1, code like %?1%) " +
" AND if(?2= '' OR ?2 is null ,1=1, `name` like %?2%) " ,
nativeQuery = true)
Page<Map> findEmp( String code, String name);
带分页和分组查询
如果加了GROUP BY 进行分组就会报错,原因是查询总记录数的时候,返回值必须是单个数值,分组后查询的结果有可能是多条记录,所以就报错。那我们就把这多条记录当成一张表,然后在进行统计总数。
//查询员工
@Query(value = "SELECT * FROM emp " +
"WHERE if(?1= '' OR ?1 is null ,1=1, code like %?1%) " +
" AND if(?2= '' OR ?2 is null ,1=1, `name` like %?2%) " +
" GROUP BY dept_id ",
countQuery = "SELECT count(*) FROM (SELECT count(*) FROM emp "+
"WHERE if(?1= '' OR ?1 is null ,1=1, code like %?1%) " +
" AND if(?2= '' OR ?2 is null ,1=1, `name` like %?2%) " +
"GROUP BY dept_id ) tempTable",
nativeQuery = true)
Page<Map> findEmp( String code, String name);
版权声明:本文为weixin_45415885原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。