Spring Boot整合Spring Data JPA

Posted --->别先生<---

tags:

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

首先说明一下,这里使用的是Springboot2.2.6.RELEASE版本,由于Springboot迭代很快,所以要注意版本问题。

1、Spring Data是Spring提供的帮助操作数据的框架,Spring Data中的一个模块叫做Spring Data JPA,Spring Data JPA只是Spring Data框架下的一个基于JPA标准操作数据的模块,Spring Data JPA底层默认的使用的是Hibernate来做的JPA实现。Spring Data JPA核心能力就是基于JPA的标准对数据进行操作,极大简化了代码的编写,简化操作持久层的代码,直接编写接口就可以了。

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5     <parent>
 6         <groupId>org.springframework.boot</groupId>
 7         <artifactId>spring-boot-starter-parent</artifactId>
 8         <version>2.2.6.RELEASE</version>
 9         <relativePath/> <!-- lookup parent from repository -->
10     </parent>
11     <groupId>com.bie</groupId>
12     <artifactId>springboot-jpa</artifactId>
13     <version>0.0.1-SNAPSHOT</version>
14     <name>springboot-jpa</name>
15     <description>Demo project for Spring Boot</description>
16 
17     <properties>
18         <java.version>1.8</java.version>
19     </properties>
20 
21     <dependencies>
22         <!-- springBoot 的启动器 -->
23         <dependency>
24             <groupId>org.springframework.boot</groupId>
25             <artifactId>spring-boot-starter-web</artifactId>
26         </dependency>
27         <!-- thymeleaf 的启动器 -->
28         <dependency>
29             <groupId>org.springframework.boot</groupId>
30             <artifactId>spring-boot-starter-thymeleaf</artifactId>
31         </dependency>
32         <!-- springBoot测试的启动器 -->
33         <dependency>
34             <groupId>org.springframework.boot</groupId>
35             <artifactId>spring-boot-starter-test</artifactId>
36             <scope>test</scope>
37             <!--<exclusions>
38                 <exclusion>
39                     <groupId>org.junit.vintage</groupId>
40                     <artifactId>junit-vintage-engine</artifactId>
41                 </exclusion>
42             </exclusions>-->
43         </dependency>
44 
45         <!-- Spring Data JPA 的启动器 -->
46         <dependency>
47             <groupId>org.springframework.boot</groupId>
48             <artifactId>spring-boot-starter-data-jpa</artifactId>
49         </dependency>
50 
51         <!-- mysql驱动包 -->
52         <dependency>
53             <groupId>mysql</groupId>
54             <artifactId>mysql-connector-java</artifactId>
55         </dependency>
56 
57         <!-- druid连接池 -->
58         <dependency>
59             <groupId>com.alibaba</groupId>
60             <artifactId>druid</artifactId>
61             <version>1.1.10</version>
62         </dependency>
63     </dependencies>
64 
65     <build>
66         <plugins>
67             <plugin>
68                 <groupId>org.springframework.boot</groupId>
69                 <artifactId>spring-boot-maven-plugin</artifactId>
70             </plugin>
71         </plugins>
72     </build>
73 
74 </project>

在application.properties配置文件中配置数据库链接信息、数据库链接池、Spring Data JPA开启正向工程、在控制台打印sql语句。

 1 # mysql的数据库驱动
 2 spring.datasource.driver-class-name=com.mysql.jdbc.Driver
 3 # mysql的链接
 4 spring.datasource.url=jdbc:mysql://localhost:3306/ssm
 5 # mysql的账号
 6 spring.datasource.username=root
 7 # mysql的密码
 8 spring.datasource.password=123456
 9 
10 # druid连接池的配置
11 spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
12 
13 # Spring Data JPA,此配置可以在实体类中使用注解来创建数据表,开启正向工程
14 spring.jpa.hibernate.ddl-auto=update
15 # 在控制台打印sql语句
16 spring.jpa.show-sql=true

创建实体类Users。

 1 package com.bie.springboot.po;
 2 
 3 import javax.persistence.*;
 4 
 5 @Entity // 表示该类是实体类
 6 @Table(name = "tb_users") // 表示该实体类和数据表进行映射,name表示实体类和数据表进行映射
 7 // 如果使用的是正向工程的话,name属性的值表示的是数据表的表名称。
 8 public class Users {
 9 
10     @Id // 表示该字段是主键
11     @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键的生成策略
12     @Column(name = "id") // 表示实体类的字段和数据表的字段进行映射的关系,如果是正向工程的话,name的值就是数据表的字段名称
13     private Integer id;// 用户编号
14 
15     @Column(name = "name")
16     private String name;// 用户姓名
17 
18     @Column(name = "age")
19     private Integer age;// 用户年龄
20 
21     @Column(name = "address")
22     private String address;// 用户地址
23 
24     // alt + insert来生成构造器、settergetter等等方法
25     public Integer getId() {
26         return id;
27     }
28 
29     public void setId(Integer id) {
30         this.id = id;
31     }
32 
33     public String getName() {
34         return name;
35     }
36 
37     public void setName(String name) {
38         this.name = name;
39     }
40 
41     public Integer getAge() {
42         return age;
43     }
44 
45     public void setAge(Integer age) {
46         this.age = age;
47     }
48 
49     public String getAddress() {
50         return address;
51     }
52 
53     public void setAddress(String address) {
54         this.address = address;
55     }
56 
57     @Override
58     public String toString() {
59         return "Users{" +
60                 "id=" + id +
61                 ", name=‘" + name +  +
62                 ", age=" + age +
63                 ", address=‘" + address +  +
64                 };
65     }
66 
67     public Users(String name, Integer age, String address) {
68         this.name = name;
69         this.age = age;
70         this.address = address;
71     }
72 
73     public Users() {
74     }
75 }

创建数据交互层接口继承JpaRepository<T,ID>。

泛型参数1,T表示的是当前需要映射的实体类类型,当前需要映射的实体。

泛型参数2,ID表示需要映射的实体中的主键的类型,当前映射的实体中的OID的类型。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.jpa.repository.JpaRepository;
 5 
 6 /**
 7  * JpaRepository<T,ID>
 8  * 泛型参数1,T表示的是当前需要映射的实体类类型,当前需要映射的实体。
 9  * 泛型参数2,ID表示需要映射的实体中的主键的类型,当前映射的实体中的OID的类型。
10  */
11 public interface UsersDao extends JpaRepository<Users, Integer> {
12 
13 }

开始测试,测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersDao;
 4 import com.bie.springboot.po.Users;
 5 import org.junit.jupiter.api.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10 
11 @RunWith(SpringJUnit4ClassRunner.class)
12 @SpringBootTest(classes = SpringbootJpaApplication.class) // 启动器,将测试类和启动器整合在一起
13 class SpringbootJpaApplicationTests {
14 
15     @Autowired
16     private UsersDao usersDao;
17 
18     @Test
19     public void testSave() {
20         Users users = new Users();
21         users.setAddress("北京市海淀");
22         users.setAge(20);
23         users.setName("张三");
24         this.usersDao.save(users);
25     }
26 
27 }

如果下面报错,就在数据库链接URL后面根据下面所示的内容即可。

?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC

 1   .   ____          _            __ _ _
 2  /\ / ____ __ _ _(_)_ __  __ _    
 3 ( ( )\___ | _ | _| | _ / _` |    
 4  \/  ___)| |_)| | | | | || (_| |  ) ) ) )
 5     |____| .__|_| |_|_| |_\__, | / / / /
 6  =========|_|==============|___/=/_/_/_/
 7  :: Spring Boot ::        (v2.2.6.RELEASE)
 8 
 9 2020-05-20 13:40:41.734  INFO 14492 --- [           main] c.b.s.SpringbootJpaApplicationTests      : Starting SpringbootJpaApplicationTests on DESKTOP-V37QSSE with PID 14492 (started by biehl in D:programideaIntelliJ IDEA 2019.1.3workspace_ideaspringboot-jpa)
10 2020-05-20 13:40:41.736  INFO 14492 --- [           main] c.b.s.SpringbootJpaApplicationTests      : No active profile set, falling back to default profiles: default
11 2020-05-20 13:40:43.891  INFO 14492 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
12 2020-05-20 13:40:44.000  INFO 14492 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 96ms. Found 1 JPA repository interfaces.
13 2020-05-20 13:40:45.245  INFO 14492 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
14 2020-05-20 13:40:45.451  INFO 14492 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
15 2020-05-20 13:40:45.813  INFO 14492 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
16 Loading class `com.mysql.jdbc.Driver. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
17 2020-05-20 13:40:47.129  INFO 14492 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
18 2020-05-20 13:40:47.326 ERROR 14492 --- [reate-173197870] com.alibaba.druid.pool.DruidDataSource   : create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/biehl?useUnicode=true&characterEncoding=utf8, errorCode 0, state 01S00
19 
20 java.sql.SQLException: The server time zone value ?й??????? is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
21     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129) ~[mysql-connector-java-8.0.19.jar:8.0.19]
22     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) ~[mysql-connector-java-8.0.19.jar:8.0.19]
23     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89) ~[mysql-connector-java-8.0.19.jar:8.0.19]
24     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63) ~[mysql-connector-java-8.0.19.jar:8.0.19]
25     at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73) ~[mysql-connector-java-8.0.19.jar:8.0.19]
26     at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:76) ~[mysql-connector-java-8.0.19.jar:8.0.19]
27     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:836) ~[mysql-connector-java-8.0.19.jar:8.0.19]
28     at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:456) ~[mysql-connector-java-8.0.19.jar:8.0.19]
29     at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246) ~[mysql-connector-java-8.0.19.jar:8.0.19]
30     at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:197) ~[mysql-connector-java-8.0.19.jar:8.0.19]
31     at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1558) ~[druid-1.1.10.jar:1.1.10]
32     at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1623) ~[druid-1.1.10.jar:1.1.10]
33     at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2468) ~[druid-1.1.10.jar:1.1.10]
34 Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException: The server time zone value ?й??????? is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
35     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_191]
36     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_191]
37     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_191]
38     at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_191]
39     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61) ~[mysql-connector-java-8.0.19.jar:8.0.19]
40     at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:85) ~[mysql-connector-java-8.0.19.jar:8.0.19]
41     at com.mysql.cj.util.TimeUtil.getCanonicalTimezone(TimeUtil.java:132) ~[mysql-connector-java-8.0.19.jar:8.0.19]
42     at com.mysql.cj.protocol.a.NativeProtocol.configureTimezone(NativeProtocol.java:2118) ~[mysql-connector-java-8.0.19.jar:8.0.19]
43     at com.mysql.cj.protocol.a.NativeProtocol.initServerSession(NativeProtocol.java:2142) ~[mysql-connector-java-8.0.19.jar:8.0.19]
44     at com.mysql.cj.jdbc.ConnectionImpl.initializePropsFromServer(ConnectionImpl.java:1310) ~[mysql-connector-java-8.0.19.jar:8.0.19]
45     at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:967) ~[mysql-connector-java-8.0.19.jar:8.0.19]
46     at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:826) ~[mysql-connector-java-8.0.19.jar:8.0.19]
47     ... 6 common frames omitted
48 
49 2020-05-20 13:40:47.330 ERROR 14492 --- [reate-173197870] com.alibaba.druid.pool.DruidDataSource   : create connection SQLException, url: jdbc:mysql://127.0.0.1:3306/biehl?useUnicode=true&characterEncoding=utf8, errorCode 0, state 01S00

 

2、Spring Data JPA提供的核心接口。

2.1)、Repository接口,提供了方法名称命名查询方式。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.repository.Repository;
 5 
 6 import java.util.List;
 7 
 8 /**
 9  * Repository接口的方法名称命名查询。
10  */
11 public interface UsersRepositoryByName extends Repository<Users, Integer> {
12 
13     /**
14      * 方法命名必须以findBy开头的,后面跟的是属性的名称,属性的名称必须大写,遵循驼峰式写法。
15      * findBy开头的,后面跟的就是查询条件。
16      * <p>
17      * 方法的名称必须要遵循驼峰式命名规则,findBy(关键字)+属性名称(首字母要大写)+查询条件(首字母大写)。
18      * 查询条件默认是等于。
19      * <p>
20      * 只要遵循findBy规则,有很多可以进行查询的条件。
21      *
22      * @param name
23      * @return
24      */
25     public List<Users> findByName(String name);
26 
27     /**
28      * @param name
29      * @return
30      */
31     public List<Users> findByNameEquals(String name);
32 
33     /**
34      * 根据姓名和年龄进行查询
35      *
36      * @param name
37      * @param age
38      * @return
39      */
40     public List<Users> findByNameAndAge(String name, Integer age);
41 
42     /**
43      * 根据姓名模糊查询
44      *
45      * @param name
46      * @return
47      */
48     public List<Users> findByNameLike(String name);
49 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersDao;
 4 import com.bie.springboot.dao.UsersRepositoryByName;
 5 import com.bie.springboot.po.Users;
 6 import org.junit.jupiter.api.Test;
 7 import org.junit.runner.RunWith;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.test.context.SpringBootTest;
10 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
11 
12 import java.util.List;
13 
14 @RunWith(SpringJUnit4ClassRunner.class)
15 @SpringBootTest(classes = SpringbootJpaApplication.class)
16         // 启动器,将测试类和启动器整合在一起
17 class SpringbootJpaApplicationTests {
18 
19     @Autowired
20     private UsersRepositoryByName usersRepositoryByName;
21 
22 
23     @Test
24     public void testFindByName() {
25         List<Users> byName = this.usersRepositoryByName.findByName("张三");
26         System.out.println("Name: " + byName);
27     }
28 
29 
30     @Test
31     public void testFindByNameEquals() {
32         List<Users> byName = this.usersRepositoryByName.findByNameEquals("张三");
33         System.out.println("Name: " + byName);
34     }
35 
36 
37     @Test
38     public void testFindByNameAndAge() {
39         List<Users> byName = this.usersRepositoryByName.findByNameAndAge("张三", 20);
40         System.out.println("Name: " + byName);
41     }
42 
43     @Test
44     public void testFindByNameLike() {
45         List<Users> byName = this.usersRepositoryByName.findByNameLike("张%");
46         System.out.println("Name: " + byName);
47     }
48 
49 }

Repository接口,提供了基于@Query注解的查询与更新方式。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.jpa.repository.Modifying;
 5 import org.springframework.data.jpa.repository.Query;
 6 import org.springframework.data.repository.Repository;
 7 
 8 import javax.transaction.Transactional;
 9 import java.util.List;
10 
11 /**
12  * Repository接口,提供了基于@Query注解的查询与更新方式。
13  */
14 public interface UsersRepositoryQueryAnnotation extends Repository<Users, Integer> {
15 
16     /**
17      * 默认支持的是HQL语句,不是标准的sql语句,底层需要进行转换,转换为标准的sql语句
18      *
19      * @param name
20      * @return
21      */
22     @Query(value = "from Users where name = :name")
23     public List<Users> queryByNameUseHQL(String name);
24 
25     /**
26      * 如果是SQL语句需要,nativeQuery = true表示的就是底层不需要进行sql语句的转换
27      *
28      * @param name
29      * @return
30      */
31     @Query(value = "select * from tb_users where name = ?", nativeQuery = true)
32     public List<Users> queryByNameUseSQL(String name);
33 
34     /**
35      * 更新操作,注意update后面是实体类的名称
36      *
37      * @param name
38      * @param id
39      */
40     @Query(value = "update Users set name = :name where id = :id")
41     @Modifying // 该注解表示需要执行一个更新操作。注意此方法调用需要开通事务的
42     @Transactional // 开启事务
43     public void updateUsersNameById(String name, Integer id);
44 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersRepositoryQueryAnnotation;
 4 import com.bie.springboot.po.Users;
 5 import org.junit.jupiter.api.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10 
11 import java.util.List;
12 
13 @RunWith(SpringJUnit4ClassRunner.class)
14 @SpringBootTest(classes = SpringbootJpaApplication.class)
15         // 启动器,将测试类和启动器整合在一起
16 class SpringbootJpaApplicationTests {
17 
18     @Autowired
19     private UsersRepositoryQueryAnnotation usersRepositoryQueryAnnotation;
20 
21     @Test
22     public void testFindByNameUsrHQL() {
23         List<Users> byName = this.usersRepositoryQueryAnnotation.queryByNameUseHQL("张三");
24         System.out.println("Name: " + byName);
25     }
26 
27     @Test
28     public void testFindByNameUseSQL() {
29         List<Users> byName = this.usersRepositoryQueryAnnotation.queryByNameUseSQL("张三");
30         System.out.println("Name: " + byName);
31     }
32 
33     @Test
34     // @Transactional // 此方法调用需要添加事务,如果@Transactional注解和@Test注解配合使用,事务自动回滚
35     // @Rollback(value = false) // 取消自动回滚
36     public void testUpdateUsersNameById() {
37         this.usersRepositoryQueryAnnotation.updateUsersNameById("张飒飒2号", 1);
38     }
39 
40 }

如果报如下所示的错误,需要将@Query(value = "from Users where name = ?")修改为@Query(value = "from Users where name = :name")。

  1  .   ____          _            __ _ _
  2  /\ / ____ __ _ _(_)_ __  __ _    
  3 ( ( )\___ | _ | _| | _ / _` |    
  4  \/  ___)| |_)| | | | | || (_| |  ) ) ) )
  5     |____| .__|_| |_|_| |_\__, | / / / /
  6  =========|_|==============|___/=/_/_/_/
  7  :: Spring Boot ::        (v2.2.6.RELEASE)
  8 
  9 2020-05-20 15:40:24.270  INFO 3352 --- [           main] c.b.s.SpringbootJpaApplicationTests      : Starting SpringbootJpaApplicationTests on DESKTOP-V37QSSE with PID 3352 (started by biehl in D:programideaIntelliJ IDEA 2019.1.3workspace_ideaspringboot-jpa)
 10 2020-05-20 15:40:24.273  INFO 3352 --- [           main] c.b.s.SpringbootJpaApplicationTests      : No active profile set, falling back to default profiles: default
 11 2020-05-20 15:40:25.690  INFO 3352 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
 12 2020-05-20 15:40:25.786  INFO 3352 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 77ms. Found 3 JPA repository interfaces.
 13 2020-05-20 15:40:26.477  INFO 3352 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
 14 2020-05-20 15:40:26.569  INFO 3352 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.12.Final
 15 2020-05-20 15:40:26.776  INFO 3352 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.0.Final}
 16 Loading class `com.mysql.jdbc.Driver. This is deprecated. The new driver class is `com.mysql.cj.jdbc.Driver. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
 17 2020-05-20 15:40:27.736  INFO 3352 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} inited
 18 2020-05-20 15:40:27.895  INFO 3352 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQL57Dialect
 19 2020-05-20 15:40:28.764  INFO 3352 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
 20 2020-05-20 15:40:28.771  INFO 3352 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit default
 21 2020-05-20 15:40:29.064  WARN 3352 --- [           main] JpaBaseConfiguration$JpaWebConfiguration : spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this warning
 22 2020-05-20 15:40:29.492  WARN 3352 --- [           main] o.s.w.c.s.GenericWebApplicationContext   : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name requestMappingHandlerAdapter defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Unsatisfied dependency expressed through method requestMappingHandlerAdapter parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
 23 Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name requestMappingHandlerAdapter defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Unsatisfied dependency expressed through method requestMappingHandlerAdapter parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
 24 2020-05-20 15:40:29.492  INFO 3352 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit default
 25 2020-05-20 15:40:29.506  INFO 3352 --- [           main] com.alibaba.druid.pool.DruidDataSource   : {dataSource-1} closed
 26 2020-05-20 15:40:29.514  INFO 3352 --- [           main] ConditionEvaluationReportLoggingListener : 
 27 
 28 Error starting ApplicationContext. To display the conditions report re-run your application with debug enabled.
 29 2020-05-20 15:40:29.520 ERROR 3352 --- [           main] o.s.boot.SpringApplication               : Application run failed
 30 
 31 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name requestMappingHandlerAdapter defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Unsatisfied dependency expressed through method requestMappingHandlerAdapter parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
 32     at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 33     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:539) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 34     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 35     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 36     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 37     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 38     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 39     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 40     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 41     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 42     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:882) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 43     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 44     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 45     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
 46     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
 47     at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
 48     at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:126) [spring-boot-test-2.2.6.RELEASE.jar:2.2.6.RELEASE]
 49     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 50     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 51     at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 52     at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 53     at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 54     at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 55     at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:98) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
 56     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$5(ClassBasedTestDescriptor.java:337) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 57     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:342) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 58     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:337) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 59     at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_191]
 60     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_191]
 61     at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[na:1.8.0_191]
 62     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_191]
 63     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_191]
 64     at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:1.8.0_191]
 65     at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743) ~[na:1.8.0_191]
 66     at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:742) ~[na:1.8.0_191]
 67     at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) ~[na:1.8.0_191]
 68     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:336) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 69     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:259) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 70     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:252) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 71     at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_191]
 72     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:251) [junit-jupiter-engine-5.5.2.jar:5.5.2]
 73     at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:29) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
 74     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
 75     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 76     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
 77     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
 78     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 79     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 80     at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 81     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 82     at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_191]
 83     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 84     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 85     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 86     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 87     at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 88     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 89     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 90     at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 91     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 92     at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_191]
 93     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 94     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 95     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 96     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 97     at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 98     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
 99     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
100     at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
101     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
102     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.5.2.jar:1.5.2]
103     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.5.2.jar:1.5.2]
104     at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.5.2.jar:1.5.2]
105     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
106     at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
107     at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
108     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
109     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
110     at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69) ~[junit5-rt.jar:na]
111     at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na]
112     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na]
113     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) ~[junit-rt.jar:na]
114 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
115     at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
116     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
117     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
118     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
119     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
120     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
121     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
122     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
123     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
124     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
125     at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
126     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1290) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
127     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1210) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
128     at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
129     at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
130     ... 81 common frames omitted
131 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
132     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
133     at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
134     ... 95 common frames omitted
135 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
136     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
137     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
138     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
139     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
140     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
141     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
142     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
143     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1114) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
144     at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory(Repositories.java:99) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
145     at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation(Repositories.java:92) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
146     at org.springframework.data.repository.support.Repositories.<init>(Repositories.java:85) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
147     at org.springframework.data.repository.support.DomainClassConverter.setApplicationContext(DomainClassConverter.java:109) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
148     at org.springframework.data.web.config.SpringDataWebConfiguration.addFormatters(SpringDataWebConfiguration.java:131) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
149     at org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite.addFormatters(WebMvcConfigurerComposite.java:81) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
150     at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration.addFormatters(DelegatingWebMvcConfiguration.java:78) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
151     at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.mvcConversionService(WebMvcAutoConfiguration.java:430) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
152     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
153     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
154     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
155     at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
156     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
157     ... 96 common frames omitted
158 Caused by: java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
159     at org.springframework.util.Assert.isTrue(Assert.java:118) ~[spring-core-5.2.5.RELEASE.jar:5.2.5.RELEASE]
160     at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.<init>(AbstractStringBasedJpaQuery.java:72) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
161     at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:61) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
162     at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:76) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
163     at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:56) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
164     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:140) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
165     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:207) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
166     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:78) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
167     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:574) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
168     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(RepositoryFactorySupport.java:567) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
169     at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_191]
170     at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_191]
171     at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1049) ~[na:1.8.0_191]
172     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_191]
173     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_191]
174     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_191]
175     at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_191]
176     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_191]
177     at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_191]
178     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.mapMethodsToQuery(RepositoryFactorySupport.java:569) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
179     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$new$0(RepositoryFactorySupport.java:559) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
180     at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_191]
181     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:559) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
182     at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:332) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
183     at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
184     at org.springframework.data.util.Lazy.getNullable(Lazy.java:212) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
185     at org.springframework.data.util.Lazy.get(Lazy.java:94) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
186     at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
187     at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
188     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
189     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
190     ... 116 common frames omitted
191 
192 2020-05-20 15:40:29.524 ERROR 3352 --- [           main] o.s.test.context.TestContextManager      : Caught exception while allowing TestExecutionListener [org.springframework.test.context.web.ServletTestExecutionListener@1de76cc7] to prepare test instance [com.bie.springboot.SpringbootJpaApplicationTests@4607d78b]
193 
194 java.lang.IllegalStateException: Failed to load ApplicationContext
195     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
196     at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
197     at org.springframework.test.context.web.ServletTestExecutionListener.setUpRequestContextIfNecessary(ServletTestExecutionListener.java:190) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
198     at org.springframework.test.context.web.ServletTestExecutionListener.prepareTestInstance(ServletTestExecutionListener.java:132) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
199     at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
200     at org.springframework.test.context.junit.jupiter.SpringExtension.postProcessTestInstance(SpringExtension.java:98) [spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
201     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$5(ClassBasedTestDescriptor.java:337) [junit-jupiter-engine-5.5.2.jar:5.5.2]
202     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.executeAndMaskThrowable(ClassBasedTestDescriptor.java:342) [junit-jupiter-engine-5.5.2.jar:5.5.2]
203     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$invokeTestInstancePostProcessors$6(ClassBasedTestDescriptor.java:337) [junit-jupiter-engine-5.5.2.jar:5.5.2]
204     at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_191]
205     at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175) ~[na:1.8.0_191]
206     at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382) ~[na:1.8.0_191]
207     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_191]
208     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_191]
209     at java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:312) ~[na:1.8.0_191]
210     at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:743) ~[na:1.8.0_191]
211     at java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:742) ~[na:1.8.0_191]
212     at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) ~[na:1.8.0_191]
213     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.invokeTestInstancePostProcessors(ClassBasedTestDescriptor.java:336) [junit-jupiter-engine-5.5.2.jar:5.5.2]
214     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.instantiateAndPostProcessTestInstance(ClassBasedTestDescriptor.java:259) [junit-jupiter-engine-5.5.2.jar:5.5.2]
215     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$2(ClassBasedTestDescriptor.java:252) [junit-jupiter-engine-5.5.2.jar:5.5.2]
216     at java.util.Optional.orElseGet(Optional.java:267) ~[na:1.8.0_191]
217     at org.junit.jupiter.engine.descriptor.ClassBasedTestDescriptor.lambda$testInstancesProvider$3(ClassBasedTestDescriptor.java:251) [junit-jupiter-engine-5.5.2.jar:5.5.2]
218     at org.junit.jupiter.engine.execution.TestInstancesProvider.getTestInstances(TestInstancesProvider.java:29) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
219     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$prepare$0(TestMethodTestDescriptor.java:106) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
220     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
221     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:105) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
222     at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.prepare(TestMethodTestDescriptor.java:69) ~[junit-jupiter-engine-5.5.2.jar:5.5.2]
223     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$prepare$1(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
224     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
225     at org.junit.platform.engine.support.hierarchical.NodeTestTask.prepare(NodeTestTask.java:107) ~[junit-platform-engine-1.5.2.jar:1.5.2]
226     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:75) ~[junit-platform-engine-1.5.2.jar:1.5.2]
227     at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_191]
228     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
229     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
230     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
231     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
232     at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
233     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
234     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
235     at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
236     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
237     at java.util.ArrayList.forEach(ArrayList.java:1257) ~[na:1.8.0_191]
238     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38) ~[junit-platform-engine-1.5.2.jar:1.5.2]
239     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139) ~[junit-platform-engine-1.5.2.jar:1.5.2]
240     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
241     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125) ~[junit-platform-engine-1.5.2.jar:1.5.2]
242     at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135) ~[junit-platform-engine-1.5.2.jar:1.5.2]
243     at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123) ~[junit-platform-engine-1.5.2.jar:1.5.2]
244     at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) ~[junit-platform-engine-1.5.2.jar:1.5.2]
245     at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122) ~[junit-platform-engine-1.5.2.jar:1.5.2]
246     at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80) ~[junit-platform-engine-1.5.2.jar:1.5.2]
247     at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32) ~[junit-platform-engine-1.5.2.jar:1.5.2]
248     at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) ~[junit-platform-engine-1.5.2.jar:1.5.2]
249     at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51) ~[junit-platform-engine-1.5.2.jar:1.5.2]
250     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
251     at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
252     at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
253     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
254     at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128) ~[junit-platform-launcher-1.5.2.jar:1.5.2]
255     at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69) ~[junit5-rt.jar:na]
256     at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) ~[junit-rt.jar:na]
257     at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) ~[junit-rt.jar:na]
258     at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) ~[junit-rt.jar:na]
259 Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name requestMappingHandlerAdapter defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Unsatisfied dependency expressed through method requestMappingHandlerAdapter parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
260     at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:798) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
261     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:539) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
262     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
263     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
264     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
265     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
266     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
267     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
268     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
269     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
270     at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:882) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
271     at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
272     at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
273     at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
274     at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
275     at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) ~[spring-boot-2.2.6.RELEASE.jar:2.2.6.RELEASE]
276     at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:126) ~[spring-boot-test-2.2.6.RELEASE.jar:2.2.6.RELEASE]
277     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
278     at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) ~[spring-test-5.2.5.RELEASE.jar:5.2.5.RELEASE]
279     ... 63 common frames omitted
280 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name mvcConversionService defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
281     at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:656) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
282     at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:636) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
283     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
284     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
285     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
286     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
287     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
288     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
289     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
290     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
291     at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
292     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1290) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
293     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1210) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
294     at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:885) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
295     at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:789) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
296     ... 81 common frames omitted
297 Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.format.support.FormattingConversionService]: Factory method mvcConversionService threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
298     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
299     at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:651) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
300     ... 95 common frames omitted
301 Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name usersRepositoryQueryAnnotation: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
302     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1796) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
303     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
304     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
305     at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
306     at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
307     at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
308     at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
309     at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1114) ~[spring-context-5.2.5.RELEASE.jar:5.2.5.RELEASE]
310     at org.springframework.data.repository.support.Repositories.cacheRepositoryFactory(Repositories.java:99) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
311     at org.springframework.data.repository.support.Repositories.populateRepositoryFactoryInformation(Repositories.java:92) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
312     at org.springframework.data.repository.support.Repositories.<init>(Repositories.java:85) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
313     at org.springframework.data.repository.support.DomainClassConverter.setApplicationContext(DomainClassConverter.java:109) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
314     at org.springframework.data.web.config.SpringDataWebConfiguration.addFormatters(SpringDataWebConfiguration.java:131) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
315     at org.springframework.web.servlet.config.annotation.WebMvcConfigurerComposite.addFormatters(WebMvcConfigurerComposite.java:81) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
316     at org.springframework.web.servlet.config.annotation.DelegatingWebMvcConfiguration.addFormatters(DelegatingWebMvcConfiguration.java:78) ~[spring-webmvc-5.2.5.RELEASE.jar:5.2.5.RELEASE]
317     at org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration$EnableWebMvcConfiguration.mvcConversionService(WebMvcAutoConfiguration.java:430) ~[spring-boot-autoconfigure-2.2.6.RELEASE.jar:2.2.6.RELEASE]
318     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_191]
319     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_191]
320     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_191]
321     at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_191]
322     at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
323     ... 96 common frames omitted
324 Caused by: java.lang.IllegalArgumentException: JDBC style parameters (?) are not supported for JPA queries.
325     at org.springframework.util.Assert.isTrue(Assert.java:118) ~[spring-core-5.2.5.RELEASE.jar:5.2.5.RELEASE]
326     at org.springframework.data.jpa.repository.query.AbstractStringBasedJpaQuery.<init>(AbstractStringBasedJpaQuery.java:72) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
327     at org.springframework.data.jpa.repository.query.SimpleJpaQuery.<init>(SimpleJpaQuery.java:61) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
328     at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromMethodWithQueryString(JpaQueryFactory.java:76) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
329     at org.springframework.data.jpa.repository.query.JpaQueryFactory.fromQueryAnnotation(JpaQueryFactory.java:56) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
330     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$DeclaredQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:140) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
331     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:207) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
332     at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:78) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
333     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lookupQuery(RepositoryFactorySupport.java:574) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
334     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$mapMethodsToQuery$1(RepositoryFactorySupport.java:567) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
335     at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193) ~[na:1.8.0_191]
336     at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_191]
337     at java.util.Collections$UnmodifiableCollection$1.forEachRemaining(Collections.java:1049) ~[na:1.8.0_191]
338     at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_191]
339     at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481) ~[na:1.8.0_191]
340     at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471) ~[na:1.8.0_191]
341     at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708) ~[na:1.8.0_191]
342     at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) ~[na:1.8.0_191]
343     at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499) ~[na:1.8.0_191]
344     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.mapMethodsToQuery(RepositoryFactorySupport.java:569) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
345     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.lambda$new$0(RepositoryFactorySupport.java:559) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
346     at java.util.Optional.map(Optional.java:215) ~[na:1.8.0_191]
347     at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.<init>(RepositoryFactorySupport.java:559) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
348     at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:332) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
349     at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$5(RepositoryFactoryBeanSupport.java:297) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
350     at org.springframework.data.util.Lazy.getNullable(Lazy.java:212) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
351     at org.springframework.data.util.Lazy.get(Lazy.java:94) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
352     at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:300) ~[spring-data-commons-2.2.6.RELEASE.jar:2.2.6.RELEASE]
353     at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:121) ~[spring-data-jpa-2.2.6.RELEASE.jar:2.2.6.RELEASE]
354     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1855) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
355     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1792) ~[spring-beans-5.2.5.RELEASE.jar:5.2.5.RELEASE]
356     ... 116 common frames omitted
357 
358 
359 Process finished with exit code -1

 

2.2)、CrudRepository<T, ID>接口。CrudRepository接口,主要是完成一些增删改查的操作,注意,CrudRepository接口继承了Repository接口,所以CrudRepository接口可以使用Repository接口的功能。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.repository.CrudRepository;
 5 
 6 /**
 7  * CrudRepository接口,主要是完成一些增删改查的操作,注意,CrudRepository接口继承了Repository接口,
 8  * 所以CrudRepository接口可以使用Repository接口的功能。
 9  */
10 public interface UsersRepositoryCrudRepository extends CrudRepository<Users, Integer> {
11 
12 
13 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersRepositoryCrudRepository;
 4 import com.bie.springboot.po.Users;
 5 import org.junit.jupiter.api.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
10 
11 import java.util.Iterator;
12 import java.util.Optional;
13 
14 @RunWith(SpringJUnit4ClassRunner.class)
15 @SpringBootTest(classes = SpringbootJpaApplication.class)
16         // 启动器,将测试类和启动器整合在一起
17 class SpringbootJpaApplicationTests {
18 
19     @Autowired
20     private UsersRepositoryCrudRepository usersRepositoryCrudRepository;
21 
22     /**
23      * 插入测试
24      */
25     @Test
26     public void testSave() {
27         // 默认开启了事务
28         Users users = new Users("亚瑟", 25, "上单");
29         Users save = this.usersRepositoryCrudRepository.save(users);
30         System.out.println("Users: " + save);
31     }
32 
33     /**
34      * 更新测试
35      */
36     @Test
37     public void testUpdate() {
38         // 默认开启了事务
39         Users users = new Users("亚瑟瑟", 26, "我上单");
40         users.setId(3);
41         // save方法,如果存在就更新,如果不存在就插入
42         Users save = this.usersRepositoryCrudRepository.save(users);
43         System.out.println("Users: " + save);
44     }
45 
46     /**
47      * 查询单个测试
48      */
49     @Test
50     public void testSelect() {
51         Optional<Users> usersOptional = this.usersRepositoryCrudRepository.findById(3);
52         Users users = usersOptional.orElse(null);
53         System.out.println("Users: " + users);
54     }
55 
56     /**
57      * 查询全部测试
58      */
59     @Test
60     public void testSelectAll() {
61         Iterable<Users> usersIterable = this.usersRepositoryCrudRepository.findAll();
62         Iterator<Users> iterator = usersIterable.iterator();
63         while (iterator.hasNext()) {
64             Users user = iterator.next();
65             System.out.println("Users: " + user);
66         }
67     }
68 
69     /**
70      * 删除测试
71      */
72     @Test
73     public void testDelete() {
74         // 默认开启了事务
75         this.usersRepositoryCrudRepository.deleteById(4);
76     }
77 
78 }

 

2.3)、PagingAndSortingRepository<T, ID>接口。该接口提供了分页和排序的操作,该接口继承了CrudRepository,则该接口可以复用CrudRepository接口的功能。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.repository.PagingAndSortingRepository;
 5 
 6 /**
 7  * PagingAndSortingRepository该接口提供了分页和排序的操作。
 8  */
 9 public interface UsersRepositoryPagingAndSortingRepository extends PagingAndSortingRepository<Users, Integer> {
10 
11 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersRepositoryPagingAndSortingRepository;
 4 import com.bie.springboot.po.Users;
 5 import org.junit.jupiter.api.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.data.domain.Page;
10 import org.springframework.data.domain.PageRequest;
11 import org.springframework.data.domain.Pageable;
12 import org.springframework.data.domain.Sort;
13 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
14 
15 import java.util.Iterator;
16 
17 @RunWith(SpringJUnit4ClassRunner.class)
18 @SpringBootTest(classes = SpringbootJpaApplication.class)
19         // 启动器,将测试类和启动器整合在一起
20 class SpringbootJpaApplicationTests {
21 
22     @Autowired
23     private UsersRepositoryPagingAndSortingRepository usersRepositoryPagingAndSortingRepository;
24 
25     @Test
26     public void testPagingAndSortingRepositorySort() {
27         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
28         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
29         // Sort对象封装了排序的规则。
30         Sort sort = Sort.by(order);
31         Iterable<Users> iterable = this.usersRepositoryPagingAndSortingRepository.findAll(sort);
32         Iterator<Users> iterator = iterable.iterator();
33         while (iterator.hasNext()) {
34             Users users = iterator.next();
35             System.out.println(users);
36         }
37     }
38 
39     @Test
40     public void testPagingAndSortingRepositoryPaging() {
41         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
42         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
43         // Sort对象封装了排序的规则。
44         Sort sort = Sort.by(order);
45 
46         // Pageable封装了分页的参数,当前页、每页显示的条数。
47         // 注意,Pageable当前页的是从0开始的。
48         // PageRequest类继承了Pageable接口。
49         int page = 0;// 当前页
50         int size = 2;// 每页显示的条数
51         Pageable pageable = PageRequest.of(page, size, sort);
52         Page<Users> usersPage = this.usersRepositoryPagingAndSortingRepository.findAll(pageable);
53         Iterator<Users> iterator = usersPage.iterator();
54         while (iterator.hasNext()) {
55             Users users = iterator.next();
56             System.out.println(users);
57         }
58         System.out.println("总条数:" + usersPage.getTotalElements());
59         System.out.println("总页数:" + usersPage.getTotalPages());
60     }
61 
62 
63 }

 

2.4)、JpaRepository<T, ID>接口。JpaRepository该接口继承了PagingAndSortingRepository接口,JpaRepository该接口是开发过程中经常使用的接口,主要的特点提供了对继承父接口中的方法的返回值进行了适配。

1 package com.bie.springboot.dao;
2 
3 import com.bie.springboot.po.Users;
4 import org.springframework.data.jpa.repository.JpaRepository;
5 
6 public interface UsersRepository extends JpaRepository<Users, Integer> {
7 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersRepository;
 4 import com.bie.springboot.po.Users;
 5 import org.junit.jupiter.api.Test;
 6 import org.junit.runner.RunWith;
 7 import org.springframework.beans.factory.annotation.Autowired;
 8 import org.springframework.boot.test.context.SpringBootTest;
 9 import org.springframework.data.domain.Page;
10 import org.springframework.data.domain.PageRequest;
11 import org.springframework.data.domain.Pageable;
12 import org.springframework.data.domain.Sort;
13 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
14 
15 import java.util.Iterator;
16 import java.util.List;
17 
18 @RunWith(SpringJUnit4ClassRunner.class)
19 @SpringBootTest(classes = SpringbootJpaApplication.class)
20         // 启动器,将测试类和启动器整合在一起
21 class SpringbootJpaApplicationTests {
22 
23     @Autowired
24     private UsersRepository usersRepository;
25 
26     @Test
27     public void testJpaRepositorySort() {
28         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
29         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
30         // Sort对象封装了排序的规则。
31         Sort sort = Sort.by(order);
32         List<Users> usersList = this.usersRepository.findAll(sort);
33         // 不用做强制类型转换了,相对于JpaRepository的父接口。
34         Iterator<Users> iterator = usersList.iterator();
35         while (iterator.hasNext()) {
36             Users users = iterator.next();
37             System.out.println(users);
38         }
39     }
40 
41     @Test
42     public void testJpaRepositorySortPaging() {
43         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
44         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
45         // Sort对象封装了排序的规则。
46         Sort sort = Sort.by(order);
47 
48         // Pageable封装了分页的参数,当前页、每页显示的条数。
49         // 注意,Pageable当前页的是从0开始的。
50         // PageRequest类继承了Pageable接口。
51         int page = 0;// 当前页
52         int size = 2;// 每页显示的条数
53         Pageable pageable = PageRequest.of(page, size, sort);
54         Page<Users> usersPage = this.usersRepository.findAll(pageable);
55         Iterator<Users> iterator = usersPage.iterator();
56         while (iterator.hasNext()) {
57             Users users = iterator.next();
58             System.out.println(users);
59         }
60         System.out.println("总条数:" + usersPage.getTotalElements());
61         System.out.println("总页数:" + usersPage.getTotalPages());
62     }
63 
64 
65 }

 

2.5)、JpaSpecificationExecutor接口。JpaSpecificationExecutor接口,该接口主要提供了多条件查询的支持,并且可以在查询中添加分页和排序。

注意:JpaSpecificationExecutor该接口是单独存在的,不是从上面的接口中做的继承。需要配合上面的四个接口之一进行使用,不然报错。

 1 package com.bie.springboot.dao;
 2 
 3 import com.bie.springboot.po.Users;
 4 import org.springframework.data.jpa.repository.JpaRepository;
 5 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 6 
 7 /**
 8  * 注意:JpaSpecificationExecutor该接口是单独存在的,不是从上面的接口中做的继承。
 9  * <p>
10  * <p>
11  * JpaSpecificationExecutor接口,该接口主要提供了多条件查询的支持,并且可以在查询中添加分页和排序。
12  */
13 public interface UsersJpaSpecificationExecutor extends JpaRepository<Users, Integer>, JpaSpecificationExecutor<Users> {
14 }

测试代码,如下所示:

  1 package com.bie.springboot;
  2 
  3 import com.bie.springboot.dao.UsersJpaSpecificationExecutor;
  4 import com.bie.springboot.dao.UsersRepository;
  5 import com.bie.springboot.po.Users;
  6 import org.junit.jupiter.api.Test;
  7 import org.junit.runner.RunWith;
  8 import org.springframework.beans.factory.annotation.Autowired;
  9 import org.springframework.boot.test.context.SpringBootTest;
 10 import org.springframework.data.domain.Sort;
 11 import org.springframework.data.jpa.domain.Specification;
 12 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
 13 
 14 import javax.persistence.criteria.*;
 15 import java.util.ArrayList;
 16 import java.util.Iterator;
 17 import java.util.List;
 18 
 19 @RunWith(SpringJUnit4ClassRunner.class)
 20 @SpringBootTest(classes = SpringbootJpaApplication.class)
 21         // 启动器,将测试类和启动器整合在一起
 22 class SpringbootJpaApplicationTests {
 23 
 24     @Autowired
 25     private UsersRepository usersRepository;
 26 
 27     @Autowired
 28     private UsersJpaSpecificationExecutor usersJpaSpecificationExecutor;
 29 
 30     /**
 31      * 单条件查询。
 32      */
 33     @Test
 34     public void testJpaSpecificationExecutorOne() {
 35         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
 36         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
 37         // Sort对象封装了排序的规则。
 38         Sort sort = Sort.by(order);
 39 
 40         // Specification接口封装了查询信息的接口。
 41         // Specification<Users>用户封装查询条件的。
 42         Specification<Users> specification = new Specification<Users>() {
 43 
 44             /**
 45              * Predicate封装了单个的查询条件。
 46              * @param root 对查询对象的属性的封装。
 47              * @param criteriaQuery 封装了我们要执行的各个部分的信息,比如select、from、order by等等信息。
 48              * @param criteriaBuilder 理解为查询条件的构造器。帮助我们定义不同的查询条件的。
 49              * @return
 50              */
 51             @Override
 52             public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
 53                 // Root对象封装了所有对象的属性
 54                 Path<Object> name = root.get("name");
 55                 String selectName = "亚瑟";
 56 
 57                 // 参数一表示当前要查询的属性。
 58                 // 参数二表示查询条件的值。
 59                 Predicate predicate = criteriaBuilder.equal(name, selectName);
 60                 return predicate;
 61             }
 62         };
 63 
 64         List<Users> usersList = this.usersJpaSpecificationExecutor.findAll(specification, sort);
 65         // 不用做强制类型转换了,相对于JpaRepository的父接口。
 66         Iterator<Users> iterator = usersList.iterator();
 67         while (iterator.hasNext()) {
 68             Users users = iterator.next();
 69             System.out.println(users);
 70         }
 71     }
 72 
 73 
 74     /**
 75      * 单条件查询。
 76      */
 77     @Test
 78     public void testJpaSpecificationExecutorMore() {
 79         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
 80         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
 81         // Sort对象封装了排序的规则。
 82         Sort sort = Sort.by(order);
 83 
 84         // Specification接口封装了查询信息的接口。
 85         // Specification<Users>用户封装查询条件的。
 86         Specification<Users> specification = new Specification<Users>() {
 87 
 88             /**
 89              * Predicate封装了单个的查询条件。
 90              * @param root 对查询对象的属性的封装。
 91              * @param criteriaQuery 封装了我们要执行的各个部分的信息,比如select、from、order by等等信息。
 92              * @param criteriaBuilder 理解为查询条件的构造器。帮助我们定义不同的查询条件的。
 93              * @return
 94              */
 95             @Override
 96             public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
 97                 // 多条件查询进行拼接操作。
 98                 List<Predicate> list = new ArrayList<>();
 99                 list.add(criteriaBuilder.equal(root.get("name"), "亚瑟"));
100                 list.add(criteriaBuilder.equal(root.get("age"), 25));
101                 Predicate[] predicates = new Predicate[list.size()];
102                 Predicate predicate = criteriaBuilder.and(list.toArray(predicates));
103                 return predicate;
104             }
105         };
106 
107         List<Users> usersList = this.usersJpaSpecificationExecutor.findAll(specification, sort);
108         // 不用做强制类型转换了,相对于JpaRepository的父接口。
109         Iterator<Users> iterator = usersList.iterator();
110         while (iterator.hasNext()) {
111             Users users = iterator.next();
112             System.out.println(users);
113         }
114     }
115 
116     /**
117      * 多条件查询的另外一种形式。
118      */
119     @Test
120     public void testJpaSpecificationExecutorThree() {
121         // Order定义了排序规则。参数一是根据倒叙还是正序,参数二是根据那个字段进行排序。
122         Sort.Order order = new Sort.Order(Sort.Direction.DESC, "id");
123         // Sort对象封装了排序的规则。
124         Sort sort = Sort.by(order);
125 
126         // Specification接口封装了查询信息的接口。
127         // Specification<Users>用户封装查询条件的。
128         Specification<Users> specification = new Specification<Users>() {
129 
130             /**
131              * Predicate封装了单个的查询条件。
132              * @param root 对查询对象的属性的封装。
133              * @param criteriaQuery 封装了我们要执行的各个部分的信息,比如select、from、order by等等信息。
134              * @param criteriaBuilder 理解为查询条件的构造器。帮助我们定义不同的查询条件的。
135              * @return
136              */
137             @Override
138             public Predicate toPredicate(Root<Users> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
139                 // 多条件查询进行拼接操作。
140                 return criteriaBuilder.or(criteriaBuilder.and(criteriaBuilder.equal(root.get("name"), "亚瑟"), criteriaBuilder.equal(root.get("age"), 20)), criteriaBuilder.equal(root.get("id"), 2));
141                 // return criteriaBuilder.and(criteriaBuilder.equal(root.get("name"), "亚瑟"), criteriaBuilder.equal(root.get("age"), 25));
142             }
143         };
144 
145         List<Users> usersList = this.usersJpaSpecificationExecutor.findAll(specification, sort);
146         // 不用做强制类型转换了,相对于JpaRepository的父接口。
147         Iterator<Users> iterator = usersList.iterator();
148         while (iterator.hasNext()) {
149             Users users = iterator.next();
150             System.out.println(users);
151         }
152     }
153 
154 
155 }

 

3、SpringBoot整合Spring Data JPA建立关系映射。

3.1、SpringBoot整合Spring Data JPA-建立双向一对多关联映射。需求说明,角色与用户的一对多的关联关系,角色是一方,用户是多方,即一个角色可以有多个用户。

 1 package com.bie.springboot.po;
 2 
 3 import javax.persistence.*;
 4 
 5 @Entity // 表示该类是实体类
 6 @Table(name = "tb_users") // 表示该实体类和数据表进行映射,name表示实体类和数据表进行映射
 7 // 如果使用的是正向工程的话,name属性的值表示的是数据表的表名称。
 8 public class Users {
 9 
10     @Id // 表示该字段是主键
11     @GeneratedValue(strategy = GenerationType.IDENTITY) // 主键的生成策略
12     @Column(name = "id") // 表示实体类的字段和数据表的字段进行映射的关系,如果是正向工程的话,name的值就是数据表的字段名称
13     private Integer id;// 用户编号
14 
15     @Column(name = "name")
16     private String name;// 用户姓名
17 
18     @Column(name = "age")
19     private Integer age;// 用户年龄
20 
21     @Column(name = "address")
22     private String address;// 用户地址
23 
24     // 用户是多方,角色是一方,所以一个用户只能分配一个角色
25     @ManyToOne // 用户对角色,多对一关系
26     @JoinColumn(name = "roles_id") // 该注解的作用就是为了维护一个外键,外键在Users这一侧
27     // 可以通过正向工程在数据表新增一个字段。
28     private Roles roles;
29 
30 
31     // alt + insert来生成构造器、settergetter等等方法
32     public Integer getId() {
33         return id;
34     }
35 
36     public void setId(Integer id) {
37         this.id = id;
38     }
39 
40     public String getName() {
41         return name;
42     }
43 
44     public void setName(String name) {
45         this.name = name;
46     }
47 
48     public Integer getAge() {
49         return age;
50     }
51 
52     public void setAge(Integer age) {
53         this.age = age;
54     }
55 
56     public String getAddress() {
57         return address;
58     }
59 
60     public void setAddress(String address) {
61         this.address = address;
62     }
63 
64     @Override
65     public String toString() {
66         return "Users{" +
67                 "id=" + id +
68                 ", name=‘" + name +  +
69                 ", age=" + age +
70                 ", address=‘" + address +  +
71                 };
72     }
73 
74     public Users(String name, Integer age, String address) {
75         this.name = name;
76         this.age = age;
77         this.address = address;
78     }
79 
80 
81     public Users() {
82     }
83 
84     public Roles getRoles() {
85         return roles;
86     }
87 
88     public void setRoles(Roles roles) {
89         this.roles = roles;
90     }
91 
92 }

角色信息表实体类,如下所示:

 1 package com.bie.springboot.po;
 2 
 3 import javax.persistence.*;
 4 import java.util.HashSet;
 5 import java.util.Set;
 6 
 7 @Entity
 8 @Table(name = "tb_roles")
 9 public class Roles {
10 
11     @Id
12     @GeneratedValue(strategy = GenerationType.IDENTITY)
13     @Column(name = "roleId")
14     private Integer roleId;// 角色编号
15 
16     @Column(name = "roleName")
17     private String roleName;// 角色名称
18 
19     // 角色是多的方式,一个角色可以分配给多个用户
20     @OneToMany(mappedBy = "roles") //表示一对多的关系,mappedBy表示向Set集合放Users,放的是当前roles相同的,外键和主键相同的
21     // 表示外键和主键相同的,做在角色表里面角色和那个用户之间的描述。
22     private Set<Users> usersSet = new HashSet<Users>();
23 
24     public Integer getRoleId() {
25         return roleId;
26     }
27 
28     public void setRoleId(Integer roleId) {
29         this.roleId = roleId;
30     }
31 
32     public String getRoleName() {
33         return roleName;
34     }
35 
36     public void setRoleName(String roleName) {
37         this.roleName = roleName;
38     }
39 
40     @Override
41     public String toString() {
42         return "Roles{" +
43                 "roleId=" + roleId +
44                 ", roleName=‘" + roleName +  +
45                 };
46     }
47 
48     public Roles(String roleName) {
49         this.roleName = roleName;
50     }
51 
52     public Roles() {
53     }
54 
55     public Set<Users> getUsersSet() {
56         return usersSet;
57     }
58 
59     public void setUsersSet(Set<Users> usersSet) {
60         this.usersSet = usersSet;
61     }
62 
63 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.UsersRepository;
 4 import com.bie.springboot.po.Roles;
 5 import com.bie.springboot.po.Users;
 6 import org.junit.jupiter.api.Test;
 7 import org.junit.runner.RunWith;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.test.context.SpringBootTest;
10 import org.springframework.data.domain.Example;
11 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12 
13 import java.util.Optional;
14 
15 @RunWith(SpringJUnit4ClassRunner.class)
16 @SpringBootTest(classes = SpringbootJpaApplication.class)
17         // 启动器,将测试类和启动器整合在一起
18 class SpringbootJpaApplicationTests {
19 
20     @Autowired
21     private UsersRepository usersRepository;
22 
23     /**
24      * 一对多关联关系的添加
25      */
26     @Test
27     public void testSave() {
28         // 创建一个用户
29         Users users = new Users("admin", 22, "北京市西城区");
30 
31         // 创建一个角色
32         Roles roles = new Roles("管理员");
33 
34         // 关联,建立双向关系
35         roles.getUsersSet().add(users);
36         users.setRoles(roles);
37 
38         // 新增,插入用户的时候进行级联操作。
39         this.usersRepository.save(users);
40     }
41 
42     /**
43      * 一对多关联关系的查询
44      */
45     @Test
46     public void testSelect() {
47         Users users = new Users();
48         users.setId(1);
49         Example<Users> example = Example.of(users);
50         Optional<Users> usersOptional = this.usersRepository.findOne(example);
51         Users users1 = usersOptional.orElse(null);
52         System.out.println(users1.toString());
53         System.out.println(users1.getRoles().toString());
54     }
55 
56 }

 

3.2、SpringBoot整合Spring Data JPA-建立双向多对多关联映射。多对多的关联关系,需求,角色与菜单多对多的关联关系,角色是多方,菜单也是多方。

 1 package com.bie.springboot.po;
 2 
 3 import javax.persistence.*;
 4 import java.util.HashSet;
 5 import java.util.Set;
 6 
 7 @Entity
 8 @Table(name = "tb_menus")
 9 public class Menus {
10 
11     @Id
12     @GeneratedValue(strategy = GenerationType.IDENTITY)
13     @Column(name = "menuId")
14     private Integer menuId;// 菜单编号
15 
16     @Column(name = "menuName")
17     private String menuName;// 菜单名称
18 
19     @Column(name = "menuUrl")
20     private String menuUrl;// 菜单名称
21 
22     @Column(name = "menuParentId")
23     private Integer menuParentId;// 菜单名称
24 
25     // mappedBy的属性值必须是Roles属性字段private Set<Menus> menusSet = new HashSet<Menus>();的值名称
26     @ManyToMany(mappedBy = "menusSet") // 多对多的关联关系,表示菜单和角色是多对多的关系
27     private Set<Roles> rolesSet = new HashSet<Roles>();
28 
29     public Integer getMenuId() {
30         return menuId;
31     }
32 
33     public void setMenuId(Integer menuId) {
34         this.menuId = menuId;
35     }
36 
37     public String getMenuName() {
38         return menuName;
39     }
40 
41     public void setMenuName(String menuName) {
42         this.menuName = menuName;
43     }
44 
45     public String getMenuUrl() {
46         return menuUrl;
47     }
48 
49     public void setMenuUrl(String menuUrl) {
50         this.menuUrl = menuUrl;
51     }
52 
53     public Integer getMenuParentId() {
54         return menuParentId;
55     }
56 
57     public void setMenuParentId(Integer menuParentId) {
58         this.menuParentId = menuParentId;
59     }
60 
61     public Menus(String menuName, String menuUrl, Integer menuParentId) {
62         this.menuName = menuName;
63         this.menuUrl = menuUrl;
64         this.menuParentId = menuParentId;
65     }
66 
67     public Menus() {
68     }
69 
70     @Override
71     public String toString() {
72         return "Menus{" +
73                 "menuId=" + menuId +
74                 ", menuName=‘" + menuName +  +
75                 ", menuUrl=‘" + menuUrl +  +
76                 ", menuParentId=" + menuParentId +
77                 };
78     }
79 
80     public Set<Roles> getRolesSet() {
81         return rolesSet;
82     }
83 
84     public void setRolesSet(Set<Roles> rolesSet) {
85         this.rolesSet = rolesSet;
86     }
87 }

角色信息实体类,如下所示:

 1 package com.bie.springboot.po;
 2 
 3 import javax.persistence.*;
 4 import java.util.HashSet;
 5 import java.util.Set;
 6 
 7 @Entity
 8 @Table(name = "tb_roles")
 9 public class Roles {
10 
11     @Id
12     @GeneratedValue(strategy = GenerationType.IDENTITY)
13     @Column(name = "roleId")
14     private Integer roleId;// 角色编号
15 
16     @Column(name = "roleName")
17     private String roleName;// 角色名称
18 
19     // 角色是多的方式,一个角色可以分配给多个用户
20     // mappedBy的属性值必须是Users属性字段private Roles roles;的值名称
21     @OneToMany(mappedBy = "roles") //表示一对多的关系,mappedBy表示向Set集合放Users,放的是当前roles相同的,外键和主键相同的
22     // 表示外键和主键相同的,做在角色表里面角色和那个用户之间的描述。
23     private Set<Users> usersSet = new HashSet<Users>();
24 
25     // 立即加载fetch = FetchType.EAGER
26     @ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER) // 多对多的关联关系,表示菜单和角色是多对多的关系
27     // joinColumns当前表中的主键所关联的中间中的外键字段.
28     // inverseJoinColumns那一侧的中间的外键的名称叫什么
29     @JoinTable(name = "tb_roles_menus", joinColumns = @JoinColumn(name = "roleId"), inverseJoinColumns = @JoinColumn(name = "menuId"))
30     // 该注解表示映射中间表之间的信息,多对多需要一个中间表
31     // name表示数据表的名称,joinColumns表示当前表中需要拿主键和中间表的那个外键做关联。
32     // 中间表有两个外键,一个中间表关联一个外键,其实就是两个一对多的关系.
33     private Set<Menus> menusSet = new HashSet<Menus>();
34 
35     public Integer getRoleId() {
36         return roleId;
37     }
38 
39     public void setRoleId(Integer roleId) {
40         this.roleId = roleId;
41     }
42 
43     public String getRoleName() {
44         return roleName;
45     }
46 
47     public void setRoleName(String roleName) {
48         this.roleName = roleName;
49     }
50 
51     @Override
52     public String toString() {
53         return "Roles{" +
54                 "roleId=" + roleId +
55                 ", roleName=‘" + roleName +  +
56                 };
57     }
58 
59     public Roles(String roleName) {
60         this.roleName = roleName;
61     }
62 
63     public Roles() {
64     }
65 
66     public Set<Users> getUsersSet() {
67         return usersSet;
68     }
69 
70     public void setUsersSet(Set<Users> usersSet) {
71         this.usersSet = usersSet;
72     }
73 
74     public Set<Menus> getMenusSet() {
75         return menusSet;
76     }
77 
78     public void setMenusSet(Set<Menus> menusSet) {
79         this.menusSet = menusSet;
80     }
81 }

测试代码,如下所示:

 1 package com.bie.springboot;
 2 
 3 import com.bie.springboot.dao.RolesRepository;
 4 import com.bie.springboot.po.Menus;
 5 import com.bie.springboot.po.Roles;
 6 import org.junit.jupiter.api.Test;
 7 import org.junit.runner.RunWith;
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.boot.test.context.SpringBootTest;
10 import org.springframework.data.domain.Example;
11 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
12 
13 import java.util.Optional;
14 import java.util.Set;
15 
16 @RunWith(SpringJUnit4ClassRunner.class)
17 @SpringBootTest(classes = SpringbootJpaApplication.class)
18         // 启动器,将测试类和启动器整合在一起
19 class SpringbootJpaApplicationTests {
20 
21     @Autowired
22     private RolesRepository rolesRepository;
23 
24     /**
25      * 多对多关联关系的添加
26      */
27     @Test
28     public void testSave() {
29         // 创建一个菜单对象
30         Menus menus = new Menus("菜单一", "菜单一", 0);
31         Menus menus2 = new Menus("菜单二", "菜单二", 2);
32 
33         // 创建一个角色
34         Roles roles = new Roles("项目经理");
35 
36         // 关联,建立双向关系
37         roles.getMenusSet().add(menus);
38         roles.getMenusSet().add(menus2);
39         menus.getRolesSet().add(roles);
40         menus2.getRolesSet().add(roles);
41 
42         // 新增,插入角色的时候进行级联操作。
43         this.rolesRepository.save(roles);
44     }
45 
46     /**
47      * 一对多关联关系的查询
48      */
49     @Test
50     public void testSelect() {
51         Roles roles = new Roles();
52         roles.setRoleId(1);
53         Example<Roles> example = Example.of(roles);
54         Optional<Roles> optionalRoles = this.rolesRepository.findOne(example);
55         Roles roles1 = optionalRoles.orElse(null);
56         System.out.println(roles1.getRoleName());
57         Set<Menus> menus = roles.getMenusSet();
58         for (Menus menus2 : menus) {
59             System.out.println(menus2);
60         }
61     }
62 
63 }

 

以上是关于Spring Boot整合Spring Data JPA的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot整合Spring Data JPA

Spring Boot:整合Spring Data JPA

Spring BootSpring Boot之使用 Spring Data Elasticsearch 整合elasticsearch

Spring boot 整合spring Data JPA+Spring Security+Thymeleaf框架(上)

手把手教你 Spring Boot 整合 Spring Data Jpa

Spring Boot 2.0.4整合Spring Data JPA和Druid,双数据源