首先说明一下,这里使用的是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来生成构造器、setter\getter等等方法
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:\program\idea\IntelliJ IDEA 2019.1.3\workspace_idea\springboot-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:\program\idea\IntelliJ IDEA 2019.1.3\workspace_idea\springboot-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来生成构造器、setter\getter等等方法
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 }