欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java jpa如何自定义sql语句

程序员文章站 2022-04-10 12:39:06
目录java jpa自定义sql语句1.多表关联查询,含条件2.清空表3.模糊查询4.查询结果为vo5.使用@param注解注入参数jpa自定义sql查询结果直接上代码最后跑一下demo代码java...

java jpa自定义sql语句

本篇只是为了再次记录自己又学习了jpa的使用,框架原生的通过解析方法名多适用于单表操作,自定义的sql查询则可以解决所有问题,记录些自定义sql语法的记录,以便后续参照。

1.多表关联查询,含条件

@query(value = "select b from qyvideo a join yjqyxx b on  a.qyid = b.id and a.cameraid = ?1 ")

2.清空表

@transactional
@modifying
@query(value = "truncate table yj_qy_xx", nativequery = true)

注:update、truncate或delete时必须使用@modifying和@transactional对方法进行注解,才能使得orm知道现在要执行的是写操作。

3.模糊查询

@query("select p from whpzxryzsxxpo p where p.ryxm like concat('%',?1,'%') and p.cyyxqq >= ?2")

4.查询结果为vo

含两个实体类

@query(value = "select new com.kun.aqsczt.vo.fxjzfbvo(u, seventinfo) from ssmsinfo u left join seventinfo seventinfo on u.referid = seventinfo.eventid where (:refertype is null or :refertype is '' or u.refertype = :refertype) and (:issend is null or :issend is '' or u.issend = :issend) ")

5.使用@param注解注入参数

分页查询

@query(value = "select a  from ceiworkaccmaybe a " +
            "where (:psnname is null or :psnname is '' or a.psnname like %:psnname%) " +
            "and (:commname is null or :commname is '' or a.commname like %:commname%) " +
            "and (:idcard is null or :idcard is '' or a.idcard like %:idcard%) " +
            "and (:doctordatestart is null or :doctordatestart is '' or a.doctordate >= :doctordatestart) " +
            "and (:doctordateend is null or :doctordateend is '' or a.doctordate <= :doctordateend) "
    )
page<ceiworkaccmaybe> getsuspectedworkaccidentverification(
            @param("psnname") string psnname,
            @param("commname") string commname,
            @param("idcard") string idcard,
            @param("doctordatestart") string doctordatestart,
            @param("doctordateend") string doctordateend,
            pageable pageable
    );

无非是把日常的sql中的表名换成了对应的实体类名,接收参数适用 ?加上第几个参数的几。当然也可使用@param注解注入参数,就变成了使用 :参数 名称接收。

jpa自定义sql查询结果

很多时候都会遇到自定义sql,自定义返回字段,而不是pojo类。这个情况要通过接口定义返回。

直接上代码

 @query(value = "select m.field as field,count(m.field) as size from migrationobject m where m.xmlname = ?1 and m.groupname = ?2 group by m.field")
    list<workcenter> getkey(string xmlname, string groupname);

对于这种情况,只返回了两个字段,就需要定义一个接口来接收(注意as别名的配置)

public interface workcenter { 
    string getfield();
    string getsize();
}

最后跑一下demo代码

   list<workcenter> list = migrationobjectrepository.getkey("en_work centerresource.xml","key");
        for (workcenter workcenter:list){
            system.out.println(workcenter.getfield());
            system.out.println(workcenter.getsize());
        }

arbpl
5
spras
2
canum
2
endda
1
werks
5

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。