jpa系列:
springboot jpa使用
springboot jpa 关系注解和mappedBy
springboot jpa自定义查询
@Query
以下语句均为hql
public interface UserRepository extends JpaRepository<User, Integer> {
@Query(value = "select t from User t")
User abcd();
}
使用@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:
@Query(value = "select t from User t where t.username=?1 and t.id=?2")
User abcd(String username,int id);
?1
和?2
分别代指形参username
和id
法2:
@Query(value = "select t from User t where t.id in :ids")
User abcd(@Param("ids") int[] aaa);
形参加注解@Param,hql中用:ids
指代。值得一提,当参数是数组时仍然可用,如例子。
返回类型
例子1:
@Query(value = "select t.username from User t")
List abcd(String username,int id);
例子为选择username列的所有数据。注意泛型问题,这里相当于List<Object>
。你也可使用String[]
作返回类型,但实际可视作jpa调用List.toArray(new String[List.size()])
,仍然有可能出现类型转换错误。
例子2:
@Query(value = "select t.id,t.username from User t")
List abcd(String username,int id);
选择两列的所有数据。注意泛型问题,这里相当于List<Object[2]>
。
Controller中直接查询
问题:只想简单执行hql语句,不想去改动DAO层中接口的方法。
答:使用org.hibernate包的Session类和Query类。链接