solr开发从查询结果集中获取对象数据
solrJ从查询结果集中获取对象数据.
方案一:自定义转换方式
/**
*
* SolrDocument与实体类转换 [测试通过]
*
* @author pudongping
*
* @param document
* SolrDocument对象
* @param clzz
* 泛型类
* @return <T>
*/
public static <T> T solrDocument2Entity(SolrDocument document, Class<T> clzz) {
if (null != document) {
try {
Object obj = clzz.newInstance();
Method m = null; Class<?> fieldType = null; for (String fieldName : document.getFieldNames()) { //需要说明的是返回的结果集中的FieldNames()比类属性多
Field[] filedArrays = clzz.getDeclaredFields(); //获取类中所有属性
for (Field f : filedArrays) {
//如果实体属性名和查询返回集中的字段名一致,填充对应的set方法
if(f.getName().equals(fieldName)){ //获取到的属性名
//private java.lang.String com.test.model.Article.id
f = clzz.getDeclaredField(fieldName); //属性类型
//private java.lang.String com.test.model.Article.id
fieldType = f.getType(); //构造set方法名 setId
String dynamicSetMethod = dynamicMethodName(f.getName(), "set"); //获取方法
//public void com.test.model.Article.setId(java.lang.String)
m = clzz.getMethod(dynamicSetMethod, fieldType); //获取到的值
LOG.info(f.getName() + "-->" + dynamicSetMethod+ "=" + fieldType.cast(document.getFieldValue(fieldName))); // 如果是 int, float等基本类型,则需要转型
if (fieldType.equals(Integer.TYPE)) {
fieldType = Integer.class;
} else if (fieldType.equals(Float.TYPE)) {
fieldType = Float.class;
} else if (fieldType.equals(Double.TYPE)) {
fieldType = Double.class;
} else if (fieldType.equals(Boolean.TYPE)) {
fieldType = Boolean.class;
} else if (fieldType.equals(Short.TYPE)) {
fieldType = Short.class;
} else if (fieldType.equals(Long.TYPE)) {
fieldType = Long.class;
} else if(fieldType.equals(String.class)){
fieldType = String.class;
}else if(fieldType.equals(Collection.class)){
fieldType = Collection.class;
}
m.invoke(obj, fieldType.cast(document.getFieldValue(fieldName)));
}
} }
return clzz.cast(obj);
} catch (ClassCastException e) {
LOG.error("请检查schema.xml中的各个field的数据类型与PO类的是否一致.",e);
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
LOG.error("请检查PO类中的field对应的各个setter和getter是否存在.",e);
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
LOG.error("请检查schema中的field是否不存在于PO类中.", e);
e.printStackTrace();
}
}
LOG.warn("solrDocument is null.");
return null;
} /**
* 批量转换, 将solrDocumentList转换为实体类 List [测试通过]
*
* @author pudongping
*
* @param documents
* solrDocumentList对象
* @param clzz
* 泛型类
*
* @return List<T>
*
*/
public static <T>List<T> solrDocument2Entity(SolrDocumentList documents, Class<T> clzz) {
if (null != documents && documents.size() > 0) {
List<T> lists = new ArrayList<T>();
for (SolrDocument sd : documents) {
Object obj = solrDocument2Entity(sd, clzz);
if (null!=obj) {
lists.add(clzz.cast(obj));
}
}
return lists;
}
LOG.warn("即将要转换的solrDocumentList为null或者size为0.");
return null;
}
需要说明的是反射里边的那个双重循环
要转换的单个SolrDocument内容如下
SolrDocument{id=2d3f7323-b212-4fae-8d69-d7fcffb0c731, title=[萧萧衷曲无处诉;为伊故,乐所苦。, 锦色芳华,岂堪人虚度?欲寄相思情万缕,捎不到,君心处。], author=柳梦璃, author_s=柳梦璃, _version_=1463433353865723904}
而我们定义的实体类
public class Article implements Serializable{
private static final long serialVersionUID = 4017316764889231758L;
private String id;
private List<String> title;
private String author;
// getter and setter
}
SolrDocument中的fieldName个数比类的属性多,所以我们需要循环去判断.
方案二: 基于注解的内置获取方式
Javabean基于注解配置
package com.test.model; import java.io.Serializable;
import java.util.List; import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.solr.client.solrj.beans.Field; public class Article implements Serializable{ /**
*
*/
private static final long serialVersionUID = 4017316764889231758L; @Field("id")
private String id; @Field("title")
private List<String> title; @Field
private String author; //@Field无参数时,匹配当前字段 public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
} public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
public List<String> getTitle() {
return title;
}
public void setTitle(List<String> title) {
this.title = title;
} @Override
public String toString() {
return ToStringBuilder.reflectionToString(this);
} }
查询结果集的两种转换方式
/**
* 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
* @param <T>
* @param server solr客户端
* @param keyword 搜索关键字
* @param pageNum 当前页码
* @param pageSize 每页显示的大小
* @param clzz 对象类型
* @return
*/
public static <T>Page<T> queryBean(SolrServer server,String keyword,int pageNum,int pageSize, Class<T> clzz){
SolrQuery query = new SolrQuery();
query.setQuery(keyword);
query.setStart((pageNum-1)*pageSize);
query.setRows(pageSize);
QueryResponse response = null;
try {
response = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
return null;
}
//查询到的记录总数
long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
//查询结果集
List<T> items = response.getBeans(clzz);
//填充page对象
return new Page<T>(pageNum, pageSize, totalRow, items);
}
/**
* 根据关键字查询 [测试通过 - 使用 solr内部转换机制]
* @param <T>
* @param server solr客户端
* @param keyword 搜索关键字
* @param pageNum 当前页码
* @param pageSize 每页显示的大小
* @param clzz 对象类型
* @return
*/
public static <T>Page<T> queryBinderBean(SolrServer server,String keyword,int pageNum,int pageSize, Class<T> clzz){
SolrQuery query = new SolrQuery();
query.setQuery(keyword);
query.setStart((pageNum-1)*pageSize);
query.setRows(pageSize);
QueryResponse response = null;
try {
response = server.query(query);
} catch (SolrServerException e) {
e.printStackTrace();
return null;
}
//查询结果集
SolrDocumentList documents = response.getResults();
//使用DocumentObjectBinder获取
List<T> items = server.getBinder().getBeans(clzz,documents);
//查询到的记录总数
long totalRow = Long.valueOf(response.getResults().getNumFound()).intValue();
//填充page对象
return new Page<T>(pageNum, pageSize, totalRow, items);
}
Junit测试
@Test
public void pageQueryBinder(){
Page<Article> page = SolrEngineHandler.queryBinderBean(server, "柳梦璃", 1, 10, Article.class);
System.out.println(page);
} @Test
public void pageQueryBean(){
Page<Article> page = SolrEngineHandler.queryBean(server, "苏若年", 1, 10, Article.class);
System.out.println(page);
}
转载请注明出处:[http://www.cnblogs.com/dennisit/p/3621728.html]
solr开发从查询结果集中获取对象数据的更多相关文章
- 当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值
当页面是动态时 如果后台存储id可以通过查询后台方式获取对象;当后台没有存储时候 只有通过前端标记了 例如标记数量为10 我们根据传递过来的10循环取值
- .NET 利用反射将对象数据添加到数据库
.NET 利用反射将对象数据添加到数据库 一些小型的项目,在不使用其他的框架(LINQ,NHibernate,EF等等框架)的前提下,这时候一些反复的增删改查就会让我们感到极其的繁琐,厌烦,为了避 ...
- NX二次开发-UFUN获取对象的显示属性(图层,颜色,空白状态,线宽,字体,高亮状态)UF_OBJ_ask_display_properties
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> UF_initialize( ...
- 【NX二次开发】获取对象边界包容盒的三个函数UF_MODL_ask_bounding_box
今天看到胡工对bounding_box的分享,我也来测试一番(原帖地址:https://www.ugapi.com/thread-10287.html) 获取对象的边界盒子的三个函数: 1 UF_MO ...
- 【NX二次开发】UF_OBJ_ask_display_properties获取对象所在层、获取对象颜色、获取对象是否隐藏、获取对象是否高亮,获取对象线宽、字体大小
UF_OBJ_ask_display_properties 返回一个对象的显示属性(层.颜色.隐藏状态.线宽和字体). UF_OBJ_disp_props_p_t结构体: layer int 对象所在 ...
- Solr开发参考文档(转)
Solr开发文档 Solr 是一种可供企业使用的.基于 Lucene 的搜索服务器,它支持层面搜索.命中醒目显示和多种输出格式.在这篇文章中,将介绍 Solr 并展示如何轻松地将其表现优异的全文本搜索 ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- solr开发 小案例
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" ...
- solr的多条件组合查询和solr的范围查询【转】
solr的多条件组合查询和solr的范围查询 版权声明:本文为博主原创文章,供大家参考,但不要抄袭哦! 存在问题:为了减轻数据库的访问压力,往往我们将必要的数据存储到solr中,并给部分字段建立索引, ...
随机推荐
- .NET Framework System.Array.Sort 数组类,加深对 IComparer、IComparable 以及泛型委托、匿名方法、Lambda 表达式的理解
本文内容 自定义类 Array.Sort 参考资料 System.Array.Sort 有很多对集合的操作,比如排序,查找,克隆等等,你可以利用这个类加深对 IComparer.IComparable ...
- Xcode missing file or .png is missing from working copy
当不小心在工程文件中删掉文件时.有可能会提示 .xxx is missing from working copy 有可能是SVN引起的.删掉这个文件就好了 如果是单个文件.进入Terminal 相 ...
- python 不需要函数重载
函数重载主要是为了解决两个问题. 可变参数类型. 可变参数个数. 另外,一个基本的设计原则是,仅仅当两个函数除了参数类型和参数个数不同以外,其功能是完全相同的,此时才使用函数重载,如果两个函数的功能其 ...
- 第五周 Word注释与交叉引用
第五周 Word注释与交叉引用 教学时间 2013-3-26 教学课时 2 教案序号 4 教学目标 1.掌握脚注.尾注.题注的概念和应用 2.掌握交叉引用的操作方法 教学过程: 复习提问 1.如何利用 ...
- Struts2添加了<s:debug>后页面无效果的解决方案
一.环境 Struts2版本 struts2.5 二.问题 在jsp页面中添加了<s:debug>后页面上无任何展示. 三.解决 在struts.xml中的struts节点下添加如下常量即 ...
- time series review
https://pdfs.semanticscholar.org/fc9c/1a94a15dd44c8c61b3e4841ecb9505f8cd37.pdf https://edoc.hu-berli ...
- [转] libtool的作用及应用
今天使用 autoconf 的时候遇到一个 libtool 的问题,觉得这个东西挺有意思,找了个文档过来,暂时记录. 转自:http://blog.csdn.net/larntin2002/artic ...
- PCI(Payment Card Industry)合规
PCI-DSS(Payment Card Industry-Data Security Standard) 1.构建并维护安全的网络 2.保护持卡人数据 3.维护漏洞管理程序 4.执行严格的访问控制 ...
- C# TripleDES NoPadding 时对待加密内容进行补字节(8个字节为一个Block)
补一个空格(半角): private static byte[] FormatData(String str) { ; ) return Encoding.GetEncoding(Consts.Cha ...
- excel文字格式设置
这里主要注意excel默认格式的设置方法,如何修改默认字体? 雅黑和4号字体? 文件----选项---常规----新建工作簿