SpringDataJPA之Repository接口

网友投稿 541 2022-05-30

Repository 接口是 spring Data JPA 中为我我们提供的所有接口中的顶层接口,而且是个标志接口,Repository 提供了两种查询方式的支持

1)基于方法名称命名规则查询

2)基于@Query 注解查询

Repository

一、基于方法名称命名规则查询

1.方法名称命名规则查询

规则:findBy(关键字)+属性名称(属性名称的首字母大写)+查询条件(首字母大写)

2.具体使用

创建接口,并定义相关方法

/** * Repository 接口使用 * 定义的方法名称 参考文档定义 */ public interface UserDao extends Repository { List findByUsernameIs(String string); List findByUsernameLike(String string); List findByUsernameAndUserageGreaterThanEqual(String name,Integer age); }

1

2

3

4

5

6

7

8

9

单元测试

/** * @program: spring-hibernate * @description: 单元测试 * @author: 波波烤鸭 * @create: 2019-05-18 09:48 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") public class TestDemo { @Autowired private UserDao usersDao; /** * 需求:使用用户名作为查询条件 */ @Test public void test1() { /** * 判断相等的条件,有三种表示方式 * 1,什么都不写,默认的就是做相等判断 * 2,Is * 3,Equal */ List list = this.usersDao.findByUsernameIs("王五"); for (Users users : list) { System.out.println(users); } } /** * 需求:根据用户姓名做 Like 处理 * Like:条件关键字 */ @Test public void test2() { List list = this.usersDao.findByUsernameLike("王%"); for (Users users : list) { System.out.println(users); } } /** * 需求:查询名称为王五,并且他的年龄大于等于 22 岁 */ @Test public void test3() { List list = this.usersDao.findByUsernameAndUserageGreaterThanEqual("王五", 22); for (Users users : list) { System.out.println(users); } } }

1

2

3

4

5

6

7

8

9

10

SpringDataJPA之Repository接口

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

查询结果

二、基于@Query 注解查询

通过方法命令的方式使用的方式如果查询条件比较复杂,那么方法的名称就会很长,不是很方便,这时我们可以通过@Query注解的方式来实现。

2.1通过 JPQL 语句查询

JPQL:通过 Hibernate 的 HQL 演变过来的。他和 HQL 语法及其相似。

创建接口

//使用@Query 注解查询 @Query(value="from Users where username = ?") List queryUserByNameUseJPQL(String name); @Query("from Users where username like ?") List queryUserByLikeNameUseJPQL(String name); @Query("from Users where username = ? and userage >= ?") List queryUserByNameAndAge(String name,Integer age);

1

2

3

4

5

6

7

单元测试

/** * 测试@Query 查询 JPQL */ @Test public void test4(){ List list = this.usersDao.queryUserByNameUseJPQL("王五"); for (Users users : list) { System.out.println(users); } } /** * 测试@Query 查询 JPQL */ @Test public void test5(){ List list = this.usersDao.queryUserByLikeNameUseJPQL(" 王%"); for (Users users : list) { System.out.println(users); } } /** * 测试@Query 查询 JPQL */ @Test public void test6(){ List list = this.usersDao.queryUserByNameAndAge("王五", 22); for (Users users : list) { System.out.println(users); } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

2.2通过SQL语句查询

我们也可以直接在定义的方法头部通过@Query注解来添加Sql语句来实现,具体如下:

//使用@Query 注解查询 SQL //nativeQuery:默认的是 false.表示不开启 sql 查询。是否对 value 中的语句做转义。 @Query(value="select * from users where username = ?",nativeQuery=true) List queryUserByNameUseSQL(String name); @Query(value="select * from users where username like ?",nativeQuery=true) List queryUserByLikeNameUseSQL(String name); @Query(value="select * from users where username = ? and userage >= ?",nativeQuery=true) List queryUserByNameAndAgeUseSQL(String name,Integer age);

1

2

3

4

5

6

7

8

单元测试

/** * 测试@Query 查询 SQL */ @Test public void test7(){ List list = this.usersDao.queryUserByNameUseSQL("王五"); for (Users users : list) { System.out.println(users); } } /** * 测试@Query 查询 SQL */ @Test public void test8(){ List list = this.usersDao.queryUserByLikeNameUseSQL(" 王%"); for (Users users : list) { System.out.println(users); } } /** * 测试@Query 查询 SQL */ @Test public void test9(){ List list = this.usersDao.queryUserByNameAndAgeUseSQL(" 王五", 22); for (Users users : list) { System.out.println(users); } }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

2.3 通过@Query 注解完成数据更新

@Query注解可以完成数据的更新操作,但是不能实现添加和删除数据的操作,实现如下:

接口中声明方法:

@Query("update Users set userage = ? where userid = ?") @Modifying //@Modifying 当前语句是一个更新语句 void updateUserAgeById(Integer age,Integer id);

1

2

3

单元测试

/** * 测试@Query update */ @Test @Transactional @Rollback(false) public void test10(){ this.usersDao.updateUserAgeById(24, 6); }

1

2

3

4

5

6

7

8

9

通过以上的介绍,我们发现Repository接口主要还是实现查询相关的操作,对DML的支持并不友好,下篇我们讲介绍CrudRepository接口。下篇见~

SQL

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:【云享新鲜】社区周刊·Vol.60-揭秘GaussDB(for Influx) 数据建模最佳方法;如何从容应对需求变更…
下一篇:JavaScript即将推出新的两个原始数据类型
相关文章