今天在jpa项目中由于业务原因需要手写一段原生sql。
在jpa的项目中是利用注解来实现原生sql的编写
@Query(value="",nativeQuery=true)
在mysql中实现select复杂查询的时候,是可以使用if()判断来加入查询的条件
项目中使用sql查询的时候
例如:
在项目连接数据库的我们会需要给sql语句注入查询条件的值
select 字段1,字段2 from 表 where 字段1 = ?1 and 字段2 = ?2;
但是我想在原生sql中添加判断于是找到了MySQL的方式
select 字段1,字段2 from 表 where 字段1 = if(true,1,2) and 字段2 = ?2
if(true,1,2) 的三个值是三目表达式的原理
我发现if()函数在SQL server中并不适用,然后我就采用了代码块的写法
if(条件)
begin
//sql语句
end
else
begin
//sql语句
end
这种写法虽说长了一点,但是还是很实用的,下面附上我写的代码块
这里如果把sql合并成为一条的话,效率是会直接下降好几十倍的
@Query(value = " if(?2 = '') " +
"begin " +
"select orders.dealerid,orders.orderid,orders.createddate,orders.customername," +
"orderlines.description, orderlines.discountPercentage, orderlines.linetotal,orderlines.partNumber,orderlines.productCode, orderlines.quantity, orderlines.salesPrice " +
"from (select id,dealerid,orderid,createddate,customername from orders " +
"where dealerid = ?3 and orderstatus in (1,2,3,4) and orderid like ?1% and ordercode in (0,2,3,4,5,6,7,8,9) and display = 1 and createddate between ?4 and ?5) as orders " +
"left join orderlines on orders.id = orderlines.orderid " +
"end " +
"else " +
"begin " +
"select orders.dealerid,orders.orderid,orders.createddate,orders.customername," +
"orderlines.description, orderlines.discountPercentage, orderlines.linetotal,orderlines.partNumber,orderlines.productCode, orderlines.quantity, orderlines.salesPrice " +
"from (select id,dealerid,orderid,createddate,customername from orders " +
"where customername = ?2 and orderstatus in (1,2,3,4) and orderid like ?1% and ordercode in (0,2,3,4,5,6,7,8,9) and display = 1 and createddate between ?4 and ?5) as orders " +
"left join orderlines on orders.id = orderlines.orderid " +
"end", nativeQuery = true)
List<Map> exportOrderDetail(String orderId,String customerName,String dealerId,String startTime,String endTime);
这种方式就是把sql语句用代码块的方式写出来去执行就OK了。
文章写到这里发现有点跑题了,更像是查找出同样的数据,在sql语句中进行判断并执行,更适用于相同数据结果、不同查找条件导出数据时来使用。
这种方法在执行上来说没太大的毛病,但是治标不治本,还是没有达到mysql的if()效果一样,希望知道的大佬们告知我一下,本人现在这里谢谢啦