欢迎来到代码驿站!

JAVA代码

当前位置:首页 > 软件编程 > JAVA代码

@Query注解的原生用法和native用法解析

时间:2022-02-04 08:53:50|栏目:JAVA代码|点击:

@Query注解的原生用法和native用法

1. @Query原生用法

@Query(value = "select u.id, u.name from User u, town t where u.id = t.id and t.place =:name")
User findUserByPlace(@Param("place") String place);
 
@Query(value = "select new User(u.id, u.name) from User u, town t where u.id = t.id and t.place = ?1") 
User UsergetUserByPlace(String place);

上面两个方法的效果是一样的,这是原生方法。

2. @Query的native查询用法

@Query(value="select * from user u, town t where u.id = t.id and t.place = ?1", nativeQuery = true)
User UsergetUserByPlace(String place);

@Query的native的查询方法要增加nativeQuery = true,默认是false,这样查询的时候就是使用原生的sql语句进行查询数据库的操作。

有nativeQuery = true和没有的区别

有nativeQuery = true时

是可以执行原生sql语句,所谓原生sql,也就是说这段sql拷贝到数据库中,然后把参数值给一下就能运行了,比如:

@Query(value = "select * from product_rel where audit_id=?1 and process_object=0 ",nativeQuery = true)
List<ProductRel> findAllByProductAuditId(Integer id);

这个时候,把select * from product_rel where audit_id=?1 and process_object=0拷贝到数据库中,并给audit_id赋一个值,那么这段sql就可以运行。其中数据库表在数据库中的表名就是product_rel,字段audit_id在数据库中也是真实存在的字段名。

没有nativeQuery = true时

就不是原生sql,而其中的select * from xxx中xxx也不是数据库对应的真正的表名,而是对应的实体名,并且sql中的字段名也不是数据库中真正的字段名,而是实体的字段名。例如:

@Query("select ratio from MdmRatio ratio  where enabledNum=1 ")
List<MdmUtilThreeProjection> findByMdmUtilThreeProjection();

此中,select ratio from MdmRatio ratio 中的MdmRatio为实体名,不是真正的数据库表名,真正的数据库表名是mdm_ratio(如上图@Table里面写的那样,MdmRatio实体对应的数据库表名是mdm_ratio。

但不一定都是这样的,可能你的MdmRatio实体对应的数据库表是mdm_ratio_abc,但whatever,随便是什么,只要它真实存在就Ok),而查询条件中的enabledNum在数据库中真正的名字是enabled_num。

这两个的作用是一样的,只是写法不同而已。涉及到HQL的知识。

上一篇:基于java中BlockingQueue的使用介绍

栏    目:JAVA代码

下一篇:浅谈Java内存泄露

本文标题:@Query注解的原生用法和native用法解析

本文地址:http://www.codeinn.net/misctech/192309.html

推荐教程

广告投放 | 联系我们 | 版权申明

重要申明:本站所有的文章、图片、评论等,均由网友发表或上传并维护或收集自网络,属个人行为,与本站立场无关。

如果侵犯了您的权利,请与我们联系,我们将在24小时内进行处理、任何非本站因素导致的法律后果,本站均不负任何责任。

联系QQ:914707363 | 邮箱:codeinn#126.com(#换成@)

Copyright © 2020 代码驿站 版权所有