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<StudentEntity> 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<String> query = cb.createQuery(String.class);
Root<StudentEntity> root = query.from(StudentEntity.class);
// 查询单个参数
query.select(root.get("studentName")).where(cb.equal(root.get("id"), id));
// 查询结果只有1条数据
return entityManager.createQuery(query).getSingleResult();
}