鉴于一年没用jpa了,最近突然要用jpa,久了不用忘记了,重新复习了一遍,做个笔记先
下面这个测试项目有user,role,privilege,均使用了jpa关联关系
废话不多说,上代码
application.properties
server.port=8082
spring.mvc.view.prefix=/WEB-INF/page/
spring.mvc.view.suffix=
spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/dev_nc?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
## alibaba db pool
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
## spring data jpa auto create table
spring.jpa.hibernate.ddl-auto=update
## show sql
spring.jpa.show-sql=true
spring.jmx.enabled=false
#解决LazyInit异常问题
spring.jpa.open-in-view=true
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
pom文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.micsoft</groupId>
<artifactId>micsoft-reload</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>micsoft-reload</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- 加入jstl所需jar包 -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<!-- jasper -->
<!-- <dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!–打包时需要加入scope,如果开发遇到启动保存,则注释掉–>
<scope>provided</scope>
</dependency>-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
<!-- <version>8.5.20</version>-->
<scope>provided</scope>
</dependency>
<!-- druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<!-- mysql配置-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--jpa配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!--解决 OrderSpecifier 未找到问题-->
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.0.3</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
</project>
三个实体类:这就不写get/set了,侧重点在关联关系
@Entity
@Table(name="t_privilege")
public class Privilege {
@Id
@Column(name ="pid")
private String pid;
@Column(name="pname")
private String name;
}
@Entity
@Table(name="t_role")
public class Role {
@Id
@Column(name="rid")
private String rid;
@Column(name="rname")
private String name;
//FetchType.EAGER:立即加载
//JoinTable:关联中间表,此时role是关联关系维护方
//joinColumns:本方在关联表中的column 名称
//inverseJoinColumns:被关联方在关联表中的名称
@ManyToMany(cascade=CascadeType.REFRESH,fetch = FetchType.EAGER)
@JoinTable(name="role_privilege",
inverseJoinColumns=@JoinColumn(name="privilegeId"),
joinColumns=@JoinColumn(name="roleId"))
private List<Privilege> privilegeId;
}
user实体类:关联role,维护和role的关联关系
@Entity
@Table(name="t_user")
public class User {
@Id
@Column(name="uid")
private String id;
@Column(name="username")
private String userName;
@Column(name="remarks")
private String remarks;
@ManyToOne
@JoinColumn(name="roleId")
private Role roleId;
}
测试代码:
@SpringBootTest
public class MicsoftReloadApplicationTests {
@Autowired
private PrivilegeRepository privilegeRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
private UserResptory userResptory;
@Test
public void contextLoads() {
/* Privilege privilege = new Privilege();
privilege.setPid(createPrimaryKey());
privilege.setName("1");
privilegeRepository.save(privilege);*/
/* Privilege dbPrivilege = privilegeRepository.getOne("34c8e8f013c24868b51d6d522713456e");
List<Privilege> list=new ArrayList<>();
list.add(dbPrivilege);
Role role = new Role();
role.setRid(createPrimaryKey());
role.setName("admin");
role.setPrivilegeId(list);
roleRepository.save(role);*/
/* for (int i=0;i<10;i++){
User user = new User();
user.setId(createPrimaryKey());
user.setRoleId(roleRepository.getOne("5ea0d2565e4e405a9d95941e4fff87e9"));
user.setUserName("wangcai-"+i);
userResptory.save(user);
}*/
/*
修改
User user = new User();
user.setId("22636aeb28084f8a98796d4420e0c702");
user.setUserName("wangcai2222");
user.setRoleId(roleRepository.getOne("5ea0d2565e4e405a9d95941e4fff87e9"));
userResptory.update(user);*/
//模糊查询
List<User> users = userResptory.findLike("wangcai");
System.out.println("size:"+users.size());
User param = new User();
// param.setId("22636aeb28084f8a98796d4420e0c702");
param.setUserName("wangcai");
//分页模糊
Pageable pageable=new QPageRequest(0,4);
ExampleMatcher matcher = ExampleMatcher.matching()
.withMatcher("userName", ExampleMatcher.GenericPropertyMatchers.contains());
// .withMatcher("username", ExampleMatcher.GenericPropertyMatchers.startsWith())//模糊查询匹配开头,即{username}%
// .withMatcher("address" ,ExampleMatcher.GenericPropertyMatchers.contains())//全部模糊查询,即%{address}%
// .withIgnorePaths("password");//忽略字段,即不管password是什么值都不加入查询条件
Example<User> example = Example.of(param,matcher);
Page<User> userPage = userResptory.findAll(example, pageable);
if(userPage!=null){
Stream<User> stream = userPage.get();
Iterator<User> iterator = userPage.iterator();
while (iterator.hasNext()){
User next = iterator.next();
System.out.println("next:"+next.getUserName());
}
}
System.out.println("size22:"+userPage.get().count());
}
@Test
public void testDelete(){
// roleRepository.deleteJoinTable("25c786994f2943f995a09c81dfa9e4eb");
// roleRepository.deleteById("25c786994f2943f995a09c81dfa9e4eb");
}
String createPrimaryKey(){
return UUID.randomUUID().toString().replace("-","");
}
}
privilege和role的repository就不写了,没有自定义的本地查询
UserRespository:
public interface UserResptory extends JpaRepository<User,String> {
@Transactional
@Modifying
@Query(value = "update t_user set username=:#{#ur.userName} , role_id=:#{#ur.roleId} where uid=:#{#ur.id}" ,nativeQuery = true)
void update(@Param("ur") User user);
@Query(value = "select * from t_user where username like %?1% ",nativeQuery = true)
List<User> findLike(String name);
@Query(value = "select * from t_user where username like %user.userName% ",nativeQuery = true)
List<User> getPageList(@Param("user") User param);
}
暂时先这样,以后遇到问题再记录