springboot jpa自定义查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot jpa自定义查询相关的知识,希望对你有一定的参考价值。

参考技术A jpa系列:
springboot jpa使用
springboot jpa 关系注解和mappedBy
springboot jpa自定义查询

以下语句均为hql

使用@Query来指定hql语句,则方法名随意,jpa将根据该注解进行查询;你也可使用sql语句,只需注解中添加参数 nativeQuery = true 即可,但不建议这样做,容易导致对象封装出错,也不利于跨平台。

关于hql,其语法基本雷同sql。不同之处基本在于:
1.hql中使用 类名 取代 表名 ,用 类名.类成员名 取代 表名.列名 。
如 from User 中的 User ,这里不是指表名,而是类名。也可加上包名如 com.example.User 。

2.hql类名建议不要省略。
自己测试时,hql直接用类成员 username 会报错,改为 user.username 就可以,与其它教程的似乎有出入,这里作建议。

3.hql没有 *
上面例子等价于sql: select t.* from user as t ,也就是hql中全选所有列的 * 不用写也不能写。注意hql和sql中 as 都是可省略的,不要忽略这点。

1.更新/删除操作只需增加注解 @Modifying

2.使用形参,有两种方式:
法1:

?1 和 ?2 分别代指形参 username 和 id

法2:

形参加注解@Param,hql中用 :ids 指代。值得一提,当参数是数组时仍然可用,如例子。

例子1:

例子为选择username列的所有数据。注意泛型问题,这里相当于 List<Object> 。你也可使用 String[] 作返回类型,但实际可视作jpa调用 List.toArray(new String[List.size()]) ,仍然有可能出现类型转换错误。

例子2:

选择两列的所有数据。注意泛型问题,这里相当于 List<Object[2]> 。

问题:只想简单执行hql语句,不想去改动DAO层中接口的方法。
答:使用org.hibernate包的Session类和Query类。 链接

以上是关于springboot jpa自定义查询的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Spring Data JPA GROUP BY 查询中返回自定义对象

java - 如何在spring boot java中编写一个函数来处理JPA存储库中的自定义查询?

在 Spring Boot 中编写自定义查询

spring boot 应用程序:jpa 查询返回旧数据

Spring JPA:从没有where子句的表中查询一列

SpringBoot Jpa 自定义查询