@Query注解的原生用法和native用法解析
目录
- @Query注解的原生用法和native用法
- 1. @Query原生用法
- 2. @Query的native查询用法
- 有nativeQuery = true和没有的区别
- 有nativeQuery = true时
- 没有nativeQuery = true时
@Query注解的原生用法和native用法
1. @Query原生用法
@Query(value = "https://www.it610.com/article/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 = "https://www.it610.com/article/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="https://www.it610.com/article/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 = "https://www.it610.com/article/select * from product_rel where audit_id=?1 and process_object=0",nativeQuery = true)List 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 ratiowhere enabledNum=1 ")ListfindByMdmUtilThreeProjection();
文章图片
此中,select ratio from MdmRatio ratio 中的MdmRatio为实体名,不是真正的数据库表名,真正的数据库表名是mdm_ratio(如上图@Table里面写的那样,MdmRatio实体对应的数据库表名是mdm_ratio。
但不一定都是这样的,可能你的MdmRatio实体对应的数据库表是mdm_ratio_abc,但whatever,随便是什么,只要它真实存在就Ok),而查询条件中的enabledNum在数据库中真正的名字是enabled_num。
这两个的作用是一样的,只是写法不同而已。涉及到HQL的知识。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量