1. Question对象
@Entity
@Table(name = "course_test_question")
@Getter
@Setter
@EqualsAndHashCode(callSuper = false)
@EntityListeners(AuditingEntityListener.class)
public class Question extends BaseEntity {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="question_bank_id")
@JsonIgnore
@Where(clause = "status=1")
QuestionBank questionBank;
/**
* 试题类型 对应QuestionTypeEnum
*/
Byte questionType;
/**
* 试题状态 对应QuestionTypeEnum
*/
Byte questionStatus;
/**
* 题干
*/
@Column(columnDefinition="varchar(1024) DEFAULT NULL COMMENT '题干'")
String questionName;
@OneToMany(mappedBy = "question",fetch = FetchType.LAZY)
@JsonIgnore
@OrderBy("name ASC")
@Where(clause = "status=1")
List<Option> optionList;
/**
* 正确答案的id
*/
String optionId;
/**
* 是否正确 判断题使用
*/
Boolean judgement;
/**
* 区域
*/
Area area;
/**
* 试题解析
*/
@Column(columnDefinition="varchar(1024) DEFAULT NULL COMMENT '解析'")
String analysis;
}
2. 重写toPredicate例子说明:
public Page<Question> getListByBankIdAndType(String questionName, String questionBankId, QuestionTypeEnum questionTypeEnum) {
// 创建分页对象
PageRequest page = PageSort.pageRequest();
QuestionBank questionBank = StringUtils.isNotEmpty(questionBankId) ? questionBankService.getId(questionBankId) : null;
Specification<Question> querySpecifi = new Specification<Question>() {
@Override
public Predicate toPredicate(Root<Question> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
List<Predicate> predicates = new ArrayList<>();
//1. 根据字段模糊匹配 属性为questionName 为 String
predicates.add(cb.like(root.get("questionName").as(String.class), "%" + questionName + "%"));
//2. 根据字段精确匹配 属性questionType 为Byte
predicates.add(cb.equal(root.get("questionType").as(Byte.class), questionTypeEnum.getCode()));
//3. 属性为对象,精确匹配对象 属性questionBAnk 为QuestinBank
predicates.add(cb.equal(root.get("questionBank").as(QuestionBank.class), questionBank));
//4. 属性为对象,精确匹配对象的某一个字段 属性为QuestionBank(对象,其有属性status byte类型)
Join<Question, QuestionBank> join=root.join("questionBank", JoinType.INNER);
predicates.add(cb.equal(join.get("status").as(Byte.class), StatusEnum.OK.getCode()));
//5. 属性为list,精确匹配list中对象某一个属性字段的值
Join<Question, Option> join = root.join("option");
preList.add(cb.equal(join.<String>get("name"), name));
//6. in操作,某一个属性对象的局限查询 属性为area(对象)
List<Area> areaList = areaService.finAllByPid(question.getArea().getId().toString());
Join<Question, Area> join = root.join("area", JoinType.INNER);
CriteriaBuilder.In<String> in = cb.in(join.get("id").as(String.class));
for (Area area : areaList) {
in.value(area.getId());
}
predicates.add(in);
return cb.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
return questionRepository.findAll(querySpecifi, page);
}