SpringDataJPA之Repository接口

网友投稿 574 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

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

SpringDataJPA之Repository接口

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即将推出新的两个原始数据类型
相关文章