1、简介
在Spring Data Jpa中,通过JpaRepository接口提供了单表的CRUD操作,通过JpaSpecificationExecutor 和 Specification接口可以构建单表和多表的动态查询。 但是,在一些特殊场景下,仍然需要我们通过EntityManager来自定义复杂查询。
2、环境准备
数据库:mysql
项目搭建:演示项目通过Spring Boot 2.2.6构建,引入spring-boot-starter-data-jpa
2.1 实体类
学校 :学生 = 1 对 多
@Entity
@Table(name = "test_school")
@Getter
@Setter
public class SchoolEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String schoolName;
@OneToMany(mappedBy = "school")
private List students = new ArrayList();
}
@Entity
@Table(name = "test_student")
@Getter
@Setter
public class StudentEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String studentName;
private Integer age;
private String address;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "school_id")
private SchoolEntity school;
}
3、示例
3.1 注入EntityManager
// 注入EntityManager
@PersistenceContext
private EntityManager entityManager;
3.2 指定字段查询
3.2.1 查询单个结果的单个字段
@Override
public String getStudentName(Long id) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery query = cb.createQuery(String.class);
Root root = query.from(StudentEntity.class);
// 查询单个参数
query.select(root.get("studentName")).where(cb.equal(root.get("id"), id));
// 查询结果只有1条数据
return entityManager.createQuery(query).getSingleResult();
}
|