Loading...

jpa实现增删改查及分页操作

日常推荐4个月前更新 Jone
187 0 0

简单介绍下jpa实现对数据库的增删查改操作以及分页。

实体类

student表

学生简单有三个属性,学生id、姓名和性别。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Data
@Entity
@Builder
@Table(name = "student")
@AllArgsConstructor
@NoArgsConstructor
public class Student {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
@Column(name = "sex")
private String sex;
}

lesson表

记录学校课程,只有两个属性,课程id和课程名称。

1
2
3
4
5
6
7
8
9
10
11
12
13
@Data
@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "lesson")
public class Lesson {
@Id
@Column(name = "id")
private Integer id;
@Column(name = "name")
private String name;
}

score表

记录每个学生的各科成绩,score表通过学生id课程id分别与学生表和课程表建立联系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Data
@Entity
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "score")
public class Score {
@Id
@Column(name = "score_id")
private Integer scoreId;
@Column(name = "student_id")
private Integer studentId;
@Column(name = "lesson_id")
private Integer lessonId;
@Column(name = "score")
private Integer score;
}

EveryScoreDto类

业务查询中间类,用来接受查询出来的数据字段。

1
2
3
4
5
6
7
8
9
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class EveryScoreDto {
private String studentName;
private String lessonName;
private Integer score;
}

用jpa进行查询

主要以下介绍三种查询方式

  1. 原生sql查询
  2. jpql查询
  3. specification查询

原生sql查询

dao层用@Query注解进行查询。

示例:

1
2
@Query(value = "select name from lesson",nativeQuery = true)
List<String> getLessonName();

注意:默认情况下nativeQuery = false,表示使用jpql方式查询,需要自行设置。

jpql查询

同样在dao层使用@Query注解进行查询。

示例:

1
2
@Query(value = "select student.name as studentName, lesson.name as lessonName, score.score as score from Score as score,Student as student,Lesson as lesson where score.studentId = student.id and score.lessonId = lesson.id and student.name= :name",nativeQuery = false)
Page<Map<String,Object>> getByName(String name, Pageable pageable);

nativeQuery可以写也可以不写,默认false。

specification查询

只用这种方式介绍下单表查询吧,多表联合查询是在没看懂,感觉不如直接写sql来的快。

1
2
3
4
5
6
Specification<Score> specification = new Specification<Score>() {
@Override
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder criteriaBuilder) {
return query.orderBy(criteriaBuilder.asc(root.get("lessonId"))).where(criteriaBuilder.greaterThanOrEqualTo(root.get("score").as(Integer.class),60)).getRestriction();
}
};

这段代码是找出学生成绩大于60并按照课程id进行升序排序。

criteriaBuilder自带了很多方法,感兴趣的可以尝试尝试。

建议设置spring.jpa.show-sql=true来显示每次查询的sql语句便于找出来错误。第一次接触jpa,感觉不是很好用 (¬_¬)。

就不演示了,实现的功能和之前写的一篇mybaties-plus一样,mybaties实现入口:mybaties-plus实现增删查改及分页操作 | 爱加班的小刘 (xiaoliu.life)

© 版权声明

相关文章