jpa多条件查询重写Specification的toPredicate方法例子

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);
}

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值