简单介绍下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进行查询
主要以下介绍三种查询方式
原生sql查询
jpql查询
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) 。