目录
(1)org.springframework.data.solr.core.query.Criteria:
(2)org.springframework.data.solr.core.query.SimpleQuery:
(3)org.springframework.data.solr.core.SolrTemplate中的SolrTemplate的使用:
想必看过教程(二)的小伙伴们,已经学会solr基础的CRUD操作了。那么接下来我会介绍使用JPA是实现自定义方法库,实现自定义动态参数,和自定义方法。
一、定义接口方法
例子:
public interface CustomTodoDocumentRepository {
//分页 + 动态多条件查询
Page<ChatMessage> pagingByConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType,
Pageable pageable);
//动态多条件查询
Page<ChatMessage> selectByConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType);
}
二、实现接口方法
- 各个包中对应类解释和应用:
(1)org.springframework.data.solr.core.query.Criteria:
作用:
自定义方法传入的参数,可以做到一个动态拼接的效果
如何使用:
Criteria conditions = new Criteria("solr中的字段名").is(要做匹配的值);
其中is为是的意思,指全值匹配,如果你配置了ik分词器,而且本字段设置为了ik类型,那么这个is也将可以进行分词搜索,根据划分的索引查找。
除了is还有另外一些不同的匹配方法:
小于:lessThanEqual
大于:greaterThanEqual
在什么区间:between
除了这些常用的其实还有很多匹配方法的,这些比较常用,如果有兴趣的小伙伴还需要别的匹配方法的话,可以取官网查看相关的api,这里就不都列出来了。
(2)org.springframework.data.solr.core.query.SimpleQuery:
作用:
自定义查询需要的条件,和分页条件
如何使用:
SimpleQuery search = new SimpleQuery(conditions, pageable);
传入设计好的参数条件,和分页条件。
(3)org.springframework.data.solr.core.SolrTemplate中的SolrTemplate的使用:
作用:
调用CRUD方法
如何使用:
比如查询方法如下,需传入自定义查询SimpleQuery和java中实体的映射类
Page<ChatMessage> results = solrTemplate.query("solr的document名字", search, ChatMessage.class);
例子:
public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {
@Resource
private SolrTemplate solrTemplate;
/**
* 动态多条件查询
* */
@Override
public Page<ChatMessage> selectByConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType) {
Criteria conditions = createSearchConditions(startTime, endTime, messageContent, chatId, messageContentType, chatType);
SimpleQuery search = new SimpleQuery(conditions);
Page<ChatMessage> chatMessageList = solrTemplate.query("enterprise_weixin", search, ChatMessage.class);
return chatMessageList;
}
/*
* 分页 + 动态多条件查询
* */
@Override
public Page<ChatMessage> pagingByConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType,
Pageable pageable) {
Criteria conditions = createSearchConditions(startTime, endTime, messageContent, chatId, messageContentType, chatType);
SimpleQuery search = new SimpleQuery(conditions, pageable);
// Page<ChatMessage> results = solrTemplate.queryForPage("enterprise_weixin",search,ChatMessage.class);
Page<ChatMessage> results = solrTemplate.query("enterprise_weixin", search, ChatMessage.class);
return results;
}
/*
* 自定义动态查询条件
* */
private Criteria createSearchConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType) {
Criteria conditions = null;
//判断聊天id不为空,空则无法定义条件
if (chatId != null) {
conditions = new Criteria("chatId").is(chatId);
} else {
return null;
}
if (messageContent != null) {
conditions = conditions.and(new Criteria("messageContent").is(messageContent));
}
if (messageContentType != -1) {
conditions = conditions.and(new Criteria("messageContentType").is(messageContentType));
}
if (chatType != -1) {
conditions = conditions.and(new Criteria("chatType").is(chatType));
}
//判断时间条件
if (startTime == 0L && endTime != 0L) {
//有最大时间
conditions = conditions.and(new Criteria("messageTime").lessThanEqual(endTime));
} else if (endTime == 0L && startTime != 0L) {
//有最小时间
conditions = conditions.and(new Criteria("messageTime").greaterThanEqual(startTime));
} else if (startTime != 0L && endTime != 0L) {
//有时间区间
conditions = conditions.and(new Criteria("messageTime").between(startTime, endTime));
}
return conditions;
}
}
三、继承自定义的方法库
@Repository
public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<ChatMessage, String> {
}
四、调用方法
最后我们就可以开心的调用相关的方法啦,想必后面就不用我示例了,只要在需要使用的地方注入
TodoDocumentRepository类,就可以使用啦。