Respository 인터페이스
Respository 두 쿼리 방법을 제공 Springdata JPA 최상위 인터페이스입니다 :
1) 명명 규칙 메소드 이름에 기초
2) 쿼리 @Qeury의 의견에 따라
1. 방법 이름 명명 쿼리
규칙 : findBy (키워드) + 속성 이름 (첫 글자는 속성 이름 대문자) + 쿼리 (첫 글자는 대문자)
퍼지 쿼리
@Test
public void test(){
List<StudentEntity> res = this.stu.findByXmLike("刘%");
for(StudentEntity tmp : res){
System.out.println(tmp);
}
}
이름 지정 규칙 방법 :
- 그리고 --- 같은 findByUsernameAndPassword (문자열 사용자 Striang의 PWD)과 SQL 및 키워드에 해당;
- 또는 --- 상응하는 등 findByUsernameOrAddress (문자열 사용자 문자열 요지)와 같은 SQL에서 또는 키워드;
- BETWEEN --- SQL 키워드 간의 등가 같은 findBySalaryBetween (INT 최대, 최소 INT);
- 작음 ---의 SQL에 해당 "<", 등 findBySalaryLessThan (INT 최대);
- [초과 --- SQL의 당량은 ">"등 findBySalaryGreaterThan INT (분);
- GreaterThanEqual
- ISNULL ---는 SQL에 상응하는 "널"등 findByUsernameIsNull ();
- 의 IsNotNull --- SQL 상당) (예 : findByUsernameIsNotNull, "null가 아닌";
- NOTNULL --- 및 IsNotNull에 해당;
- 마찬가지로 ---의 SQL에 해당 "과 같은"등 findByUsernameLike (문자열 사용자);
- NOTLIKE ---의 SQL 동등한 같은 findByUsernameNotLike (문자열 사용자)로, "싫어";
- 있는 OrderBy --- 같은 findByUsernameOrderBySalaryAsc (문자열 사용자)와 같은 "에 의해 순서"의 SQL에 해당하는;
- 아니 --- 같은 findByUsernameNot (문자열 사용자) "=!"로 SQL, 동등;
- ---, 같은 findByUsernameIn (스 컬렉션 "의"로에서 SQL 동등한
UserList에 파라미터), 컬렉션 형 방법 일 수 있고, 또는 어레이 가변 길이 매개 변수 일 수있다; - NotIn --- (예 : findByUsernameNotIn으로 "NOT IN"의 SQL에 해당하는 컬렉션
UserList에 파라미터), 컬렉션 형 방법 일 수 있고, 또는 어레이 가변 길이 매개 변수 일 수있다;
단점 : 쿼리가 너무 복잡 경우, 메소드 이름은 매우 긴 것
@query을 바탕으로 2. 쿼리 노트
JPQL 문 쿼리 2.1
JPQL : 진화의 Hibernate의 HQL을 통해. 그리고 HQL 구문은 매우 유사합니다.
구현이 필요하지 않습니다;
클래스 이름과 클래스 멤버를 사용하여 문에서 JPQL 변수.
//使用@Query注解查询, 抽象方法, 参数列表的顺序就是sql语句中的顺序
@Query(value="from StudentEntity where xm like ?1")
List<StudentEntity> queryByXm(String name);
//多值查询
@Query(value="from StudentEntity where xm is ?1 and yxh is ?2")
List<StduentEntity> queryByXmAndYxh(String name, Integer yxh);
//或是这样的Like查询写法
@Query(value="from StudentEntity where xm like %:name%")
List<StudentEntity> queryByXm(@Param("name") String name);
JPQL의 매개 변수 할당 문에 @Param ( "이름")
쿼리 SQL 문을 통해 2.2
데이터베이스에서 테이블 이름과 데이터 테이블을 사용하여 @query 문
nativeQuery 사실 사용하는 SQL 문을 =
//可标可不标参数顺序, 多值查询时不标明顺序按次序填充
@Query(value = "select * from S where xm = ?1", nativeQuery = true)
List<StudentEntity> queryBySQL(String name);
3. 페이징
PagingAndSortingRepository
3.1. 페이징 처리
@Test
public void testPaging(){
int page, size;
//page 为当前页的索引,起始为0
//size 为页面大小
page = 1;
size = 5;
Pageable p = new PageRequest(page,size);
Page<StudentEntity> res = this.stu.findAll(p);
for(StudentEntity s: res){
System.out.println(s);
}
}
3.2 주문 과정
/*
对单列做排序
*/
@Test
public void testSort(){
// Sort: 该对象封装了排序规则以及指定的排序字段(对象的属性来表示)
// direction: 排序规则
// properties: 指定做排序的属性, 给表对应类的属性
Sort sort = new Sort(Sort.Direction.DESC, "xh");
List<StudentEntity> res = this.stu.findAll(sort);
for(StudentEntity s: res){
System.out.println(s);
}
}
/*
多列排序
*/
@Test
public void testSort2(){
//Sort sort = new Sort();
Sort.Order o1 = new Sort.Order(Sort.Direction.DESC, "yxh");
Sort.Order o2 = new Sort.Order(Sort.Direction.ASC, "csrq");
Sort sort = new Sort(o1,o2);
List<StudentEntity> res = this.stu.findAll(sort);
for(StudentEntity s: res){
System.out.println(s);
}
}
4. JpaSpecificationExecutor 인터페이스
단독으로 사용할 수 없습니다, 상속해야 JpaRepository, 그렇지 않으면 당신은 프록시 객체를 생성 할 수 없습니다.
완료 복잡한 다중 기준 쿼리 페이징 및 정렬 및 지원
//1.创建接口
public interface StudentRepository extends JpaRepository<StudentEntity,Integer>, JpaSpecificationExecutor<StudentEntity>
5.1 하나의 상태 쿼리
같은 판정 호 criteriaBuilder 질의 방법에있어서, 결정이 동일 퍼지 질의있다
root.get () 메소드는 값이 .as을 사용할 수 있습니다 반환 (String.class) 캐릭터 클래스로 전환 (또는 다른 지정된 유형)
/*
JpaSpecificationExecutor
单条件查询
*/
@Test
public void testSpecification(){
Specification<StudentEntity> spec= new Specification<StudentEntity>() {
/*
@return Predicate:定义了查询条件
@param Root<StduentEntity> root:根对象,封装了查询条件的对象
@param criteriaQuery :定义了基本的查询,一般不常用
@param criteriaBuilder : 创建一个查询条件
*/
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
Predicate pre = criteriaBuilder.equal(root.get("xm"), "刘%");
return pre;
}
};
List<StudentEntity> res = this.stu.findAll(spec);
for(StudentEntity s: res){
System.out.println(s);
}
}
이상 5.2 기준 쿼리
다중 기준은 다양한 방법을 쿼리
/*
JpaSpecificationExecutor
需求:使用姓名和学院查询数据
多条件查询方式一
*/
@Test
public void testSpecification2(){
Specification<StudentEntity> spec= new Specification<StudentEntity>() {
/*
@return Predicate:定义了查询条件
@param Root<StduentEntity> root:根对象,封装了查询条件的对象
@param criteriaQuery :定义了基本的查询,一般不常用
@param criteriaBuilder : 创建一个查询条件
*/
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
List<Predicate> plist = new ArrayList<>();
plist.add(criteriaBuilder.like(root.get("xm"), "刘%"));
plist.add(criteriaBuilder.equal(root.get("yxh"),2));
//此时条件之间没有关联
Predicate [] arr = new Predicate[plist.size()];
return criteriaBuilder.or(plist.toArray(arr)); //规定关系之间的关系并返回查询规则
//如果再想或关系,就将cb返回的Predicate对象再放入cb.or方法中
}
};
List<StudentEntity> res = this.stu.findAll(spec);
for(StudentEntity s: res){
System.out.println(s);
}
}
/*
JpaSpecificationExecutor
需求:使用姓名和学院查询数据
多条件查询方式二
*/
@Test
public void testSpecification2(){
Specification<StudentEntity> spec= new Specification<StudentEntity>() {
/*
@return Predicate:定义了查询条件
@param Root<StduentEntity> root:根对象,封装了查询条件的对象
@param criteriaQuery :定义了基本的查询,一般不常用
@param criteriaBuilder : 创建一个查询条件
*/
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
return cb.or(cb.like(root.get("xm"),"刘%"), cb.equal(root.get("yxh"),2));
}
};
List<StudentEntity> res = this.stu.findAll(spec);
for(StudentEntity s: res){
System.out.println(s);
}
}
이상 5.3 기준 쿼리 페이징 +
/*
查询院系号为1或性别为女的同学 结果分页
*/
@Test
public void test4(){
Specification<StudentEntity> spec = new Specification<StudentEntity>() {
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
return cb.and(cb.equal(root.get("yxh"),1),cb.equal(root.get("xb"),0));
}
};
Pageable pg = new PageRequest(0,2);
Page<StudentEntity> res = this.stu.findAll(spec, pg);
System.out.println(res.getTotalElements());
System.out.println(res.getTotalPages());
for(StudentEntity s :res){
System.out.println(s);
}
}
5.4 + 정렬 기준 쿼리
/*
查询院系号为1或性别为女的同学,结果按学号做倒序排序
*/
@Test
public void test5(){
Specification<StudentEntity> spec = new Specification<StudentEntity>() {
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
return cb.and(cb.equal(root.get("yxh"),1),cb.equal(root.get("xb"),0));
}
};
Sort sort = new Sort(Sort.Direction.DESC,"xh");
List<StudentEntity> res = this.stu.findAll(sort);
for(StudentEntity s :res){
System.out.println(s);
}
}
페이징 + 5.5 + 정렬 기준 쿼리
정렬 페이지 객체로 통합
new PageRequest(0,3,sort);
/*
查询院系号为1或性别为女的同学,做分页处理,结果按学号做倒序排序
*/
@Test
public void test6(){
//排序定义
Sort sort = new Sort(Sort.Direction.DESC,"xh");
//分页定义,Pageable对象中存在
Pageable pg = new PageRequest(0,3,sort);
Specification<StudentEntity> spec = new Specification<StudentEntity>() {
@Override
public Predicate toPredicate(Root<StudentEntity> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
return cb.and(cb.equal(root.get("yxh"),1),cb.equal(root.get("xb"),0));
}
};
Page<StudentEntity> res = this.stu.findAll(pg);
System.out.println("总条目数: "+res.getTotalElements());
System.out.println("页数: "+res.getTotalPages());
for(StudentEntity s : res){
System.out.println(s);
}
}
엔티티 클래스
5.1 기본 키 정의
//自增方式创建主键
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Id
@Column(name="xh")
private int xh;
@Temporal 방법
//JPA将时间映射到日期
@Temporal(TemporalType.DATE)
@Column(name = "csrq")
private Date csrq;
6. 관계
6.1 한 관계
예 : 역할 및 사용자 - 하나
//测试一对一关系 学生类
@OneToOne(cascade = CascadeType.PERSIST) //表示级联关系,增加学生时,对应用户也会加入数据库
@JoinColumn(name="id") //表示外键,使用对应表的主键(数据库内的名称)
private Account account;
//用户类
@OneToOne(mappedBy = "account") //看谁引用了这个account
private StudentEntity student;
한 관계를 작동
//增添数据
@Test
public void test7(){
//创建用户对象
Account acc = new Account();
acc.setUsername("玩家");
//创建学生对象
StudentEntity student = new StudentEntity();
student.setXm("李修文");
student.setYxh(3);
student.setSjhm("13120716616");
student.setPassword("0");
//student.setCsrq(new Date("1998-7-24"));
student.setJg("上海");
student.setXb(1);
//关联
student.setAccount(acc);
acc.setStudent(student);
//保存学生,相应地acc中也会出现“玩家”条目
this.stu.save(student);
}
/*
根据学号查询学生,并查询其账户
*/
@Test
public void test8(){
StudentEntity student = this.stu.findByXh(1112);
System.out.println("学生信息:"+student);
Account acc = student.getAccount();
System.out.println(acc);
}
6.2 다 관계
//用户类
@Id
@Column(name="user_id")
private int userId;
@Column(name="user_name")
private String name;
@OneToMany
@JoinColumn(name="role_id")
private Role role;
//角色类
@Id
@Column(name="role_id")
private Integer roleId;
@Column(name="role_name")
private String roleName;
@OneToMany(mappedBy = "role")
private Set<User> users = new HashSet<User>();
6.3 - 많은 관계
그것은 중간 테이블을 생성합니다
//学生类
/*
@JoinTable: 配置中间表信息
joinColumns: 建立当前表在中间表的外键字段
*/
@ManyToMany(cascade = CasadeType.PERSIST, fetch = FetchType.EAGER) //级联操作,添加不存在的数据时同时导入课程类, 放弃延迟加载改为立即加载
@JoinTable(name="t_stu_class",joinColumns=@JoinColumn(name="stu_xh"), inverseJoinColumns = @JoinColumn(name="class_id"))
private Set<Class> classes = new HashSet<Class>();
//课程类
@ManyToMany(mappedBy = "classes") //映射引用课程类的对象
private Set<Student> students = new HashSet<Student>();
* 여부 또는 특정 용도의 오픈 클래스에서 작동 대다, 계단식 노트
없는 경우 즉시 쿼리시에, 그 후에 불평 출력을 대응하는 모든 과정의 학생들과 함께로드 (때문에 지연로드의 세션은 학생을 검색 한 후 폐쇄)