jpa:repository中@Query有nativeQuery = true和没有的区别

Posted 花和尚也有春天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jpa:repository中@Query有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 where enabledNum=1 ")

List<MdmUtilThreeProjection> findByMdmUtilThreeProjection();

ratio 是实体类中的字段名(非数据库的),MdmRatio为实体名,不是真正的数据库表名,真正的数据库表名是mdm_ratio(如上图@Table里面写的那样,MdmRatio实体对应的数据库表名是mdm_ratio。但不一定都是这样的,可能你的MdmRatio实体对应的数据库表是mdm_ratio_abc),而查询条件中的enabledNum在数据库中真正的名字是enabled_num。

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

例:

//查询表中个别字段
    @Query(value = "select new UserEntity(lastName,email) from UserEntity  ")
    List<UserEntity> queryUsersNotLocalJpa();

 

以上是关于jpa:repository中@Query有nativeQuery = true和没有的区别的主要内容,如果未能解决你的问题,请参考以下文章

使用JPA中@Query 注解实现update 操作

Spring Data JPA Repository Method Query 用like?

是否可以在 Spring Data JPA Repository 的 @Query 注释中使用 PostgreSQL 匿名块(PL/pgSQL)?

jpa @Query()参数设置,??X实体类对象参数设置

查询:参数中的属性名称

处理 JPA 中的空或 null 集合参数