Spring Jpa 可根据条件查询方法有2种(目前只了解2种有知道其他的请回复谢谢)
一种就是使用@query方法拼写hql进行查找。
另外一种就是jpa封装好的Specification<class>(){}方法
第一种很常见一般会些sql的 看下api就了解了
下面要记录下第2种,近期使用过
先上代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
@Override
@Transactional
(readOnly=
true
)
public
Page<Question> questionList(
final
String keyword,
final
String knowledge,
final
String type,
final
String itemBankId,
final
String gradeId,
final
String subjectId,Pageable pageable) {
Page<Question> question = questionDao.findAll(
new
Specification<Question>() {
@Override
public
Predicate toPredicate(Root<Question> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
Predicate predicate = cb.conjunction();
List<Expression<Boolean>> expressions = predicate.getExpressions();
if
(StringUtils.isNotBlank(keyword)) {
expressions.add(cb.like(root.<String>get(
"keyword"
),
"%"
+keyword+
"%"
));
//关键字
}
if
(StringUtils.isNotBlank(knowledge)) {
expressions.add(cb.like(root.<String>get(
"knowledge"
),
"%"
+knowledge +
"%"
));
//知识点
}
if
(NumberUtils.isDigits(type)) {
expressions.add(cb.equal(root.<String>get(
"type"
), type));
//l类型
}
if
(StringUtils.isNotBlank(itemBankId)) {
expressions.add(cb.equal(root.<String>get(
"puuid"
), itemBankId));
//父节点
}
if
(NumberUtils.isDigits(gradeId)) {
expressions.add(cb.equal(root.<Grade>get(
"grade"
).<Long>get(
"id"
), NumberUtils.toLong(gradeId)));
//年级
}
if
(NumberUtils.isDigits(subjectId)) {
expressions.add(cb.equal(root.<Subject>get(
"subject"
).<Long>get(
"id"
), NumberUtils.toLong(subjectId)));
//学科
}
expressions.add(cb.equal(root.<Long>get(
"deleteBy"
),
0
));
return
predicate;
}
},pageable);
return
question;
}
|
以上为一个question表为主表,连接grade表和subject表的带条件查找。
首先说几个要点,
1.使用Specification方法进行查找,其参数必须是final类型。
2.编写模糊查询调用like时,参数前后需要自己添加"%"符号。(也许有现成直接调用不需要自己添加的方法,但没找到,知道的请告知)。
3.连接表时有两中方法:
第一种是上面代码写的root.<Grade>get(
"grade"
).<Long>get(
"id"
),找到question实体中对应着的grade的实体的id字段。
第二种是直接写
root.
<Long>get(
"gradeId"
),question表对应的外键字段。
4.Specification,方法默认是分页方法需要传入分页信息。
另外,说几个方法
gradeId
NumberUtils.isNumber(gradeId) 查看参数是否为整数(int)