目录
在前面的学习中,我们已经配置好的我们要使用的字段了,那么我们可以开心的在idea 中写CRUD操作了。下面进行idea中如何操作solr。
本文先介绍solr比较简单易上手的一个包:org.springframework.data.solr.repository
其中SolrCrudRepository类已经封装了CRUD了,很方便。
在教程(三)中会介绍相对比较复杂的自定义方法库,本篇章为solr的入门,实现较为简单的CRUD功能。
一、配置环境连接
maven依赖配置:
<!-- solr新增依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-solr</artifactId>
<version>2.1.0.RELEASE</version>
<optional>true</optional>
</dependency>
<!-- solr新增依赖-->
yml文件配置:
spring:
data:
solr:
host: solr地址
二、CRUD操作
映射solr中配置的字段
需要映射solr中的域名到java中的实体,然后写个新的类继承SolrCrudRepository就可以了。
步骤一:实体类 @SolrDocument(collection = "enterprise_weixin") 定义其document的名字
其中的成员变量 @Field 匹配id 、@Field("chat_fromUserId") 匹配其他域名
例:
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@SolrDocument(collection = "你在solr配置的document名称")
public class TbItem implements Serializable {
private static final long serialVersionUID = 1L;
@Field
private String id;
@Field("chat_fromUserId")
private String fromUserId;
@Field("chat_fromUserName")
private String fromUserName;
@Field("chat_fromUserAvatar")
private String fromUserAvatar;
@Field("chat_toUserId")
private String toUserId;
@Field("chat_toUserName")
private String toUserName;
@Field("chat_messageContent")
private String messageContent;
@Field("chat_messageTime")
private Long messageTime;
@Field("chat_chatId")
private String chatId;
}
步骤二:新建类继承SolrCrudRepository
继承了此类,就相当于你spring中的mapper层了,可以定义为@Repository
继承了此类,可以调用其已有的方法,也可以自定义方法,下面给出操作。
public interface SolrRepository extends SolrCrudRepository<T, ID> {}
其中T为idea中对应数据库的实体,ID为主键定义的数据类型。
例:数据库对应的实体为TbItem ,且主键类型为String,则为:
public interface SolrRepository extends SolrCrudRepository<TbItem , String> {}
步骤三:在service层注入此类,调用此继承类的方法,本次用了Junit测试,直接在test中引入了
下面现在开始CURD操作:
Create增:
sava(父类自带的方法直接就可以使用),传入需要保存的实体类信息
TbItem item = TbItem.builder().fromUserId("456").toUserId("789").messageContent("今天天气不错呀").id(CreateID.getUid()).build();
System.out.println(item);
solrDemoRepository.save(item);
Retrieve查:
需要查询分页传入Pageable,需要排序传入Sort。
//参数1:排序方式 参数2:排序的字段
Sort sort=new Sort(Sort.Direction.DESC,"chat_messageTime");
//参数1:页码 参数2:每页的数据量
Pageable pageable=new PageRequest(pageNum,pageSize);
//参数1:页码 参数2:每页的数据量 参数3:排序方式 参数4:排序的字段
Pageable pageable = new PageRequest(pageNum, pageSize, Sort.Direction.DESC, "chat_messageTime");
(1)继承的类中定义方法:
<1>从父类继承过来的方法不用定义,可以直接使用
<2>可以根据 findBy + 实体类中的字段名(支持多字段联查只要后面用And连接) 定义方法 并且传参就可以调用:
public List<TbItem> findByFromUserId(String fromUserId);
public Page<TbItem> findByMessageContent(String messageContent, Pageable pageable);
<3>自定义方法 @Query
field参数数据
filters 定义传入的参数和field匹配
/**
*多条件条件 + 分页 查询
* */
@Query(value = "*:*", fields = {"chat_messageTime", "chat_messageContent", "chat_chatId", "chat_messageContentType", "chat_chatType"},
filters = {"chat_messageTime:[?0 TO ?1]", "chat_messageContent:?2", "chat_chatId:?3", "chat_messageContentType:?4", "chat_chatType:?5"})
public Page<ChatMessage> pagingWithConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType,
Pageable pageable);
/**
* 条件 查询
* */
@Query(value = "*:*", fields = {"chat_messageTime", "chat_messageContent", "chat_chatId", "chat_messageContentType", "chat_chatType"},
filters = {"chat_messageTime:[?0 TO ?1]", "chat_messageContent:?2", "chat_chatId:?3", "chat_messageContentType:?4", "chat_chatType:?5"})
public List<ChatMessage> selectAllWithConditions(long startTime,
long endTime,
String messageContent,
String chatId,
int messageContentType,
int chatType,
Sort sort);
Update改:
先进行根据id的查询,把数据查询出来后,如果存在,就用返回的数据修改相关的参数后,用sava保存
Optional<ChatMessage> chatMessages = solrRepository.findById(preMessageId);
//判断查询的对象存不存在
if (chatMessages.isPresent()) {
//存在则更新
ChatMessage chatMessage = chatMessages.get();
chatMessage.setId(preMessageId);
solrRepository.save(chatMessage);
}
Delete删除:
public void deleteById();