Mapping 字段地图上的类Ormlite查询

Mapping 字段地图上的类Ormlite查询,mapping,ormlite,Mapping,Ormlite,我已经使用ORMLite将近一年了,我发现它非常棒,非常简单,而且很有效 我有一个实现广泛搜索功能的项目要求——用户输入一个值,表中的任何匹配字段都应该返回(POJO)。表与Java对象具有简单的1:1关系 我可以使用queryBuilder()为已知类实现这一点。其中()。与(…)类似,我希望为所有子类构建通用动态函数 我所有的持久类都派生自一个“持久”基类,该基类具有一些基本的内务管理,处理单个对象的存储和删除。这就是我放置“find”函数的地方,理想情况下,它返回迭代器或列表,最好是迭代器

我已经使用ORMLite将近一年了,我发现它非常棒,非常简单,而且很有效

我有一个实现广泛搜索功能的项目要求——用户输入一个值,表中的任何匹配字段都应该返回(POJO)。表与Java对象具有简单的1:1关系

我可以使用queryBuilder()为已知类实现这一点。其中()。与(…)类似,我希望为所有子类构建通用动态函数

我所有的持久类都派生自一个“持久”基类,该基类具有一些基本的内务管理,处理单个对象的存储和删除。这就是我放置“find”函数的地方,理想情况下,它返回迭代器或列表,最好是迭代器

我已经得到了所有数据库字段注释字段的映射现在,我只想要一个“蛮力”字符串“X”出现在字段Y的任何地方。稍后我将计算数据类型转换并进行检查。如果我可以动态构建查询,那么我可以在下一个版本中解决数据类型问题

我已经研究过将贴图作为参数的方法,它们是一种狭义的匹配,即所有方法都必须匹配。我在寻找相反的答案:任何比赛都可以

我能想到的唯一方法是构建单独的“类似”组件,并将它们串成一个更大的语句。从文档中,我不知道如何动态地做到这一点


欢迎任何建议。

好的,我已经弄乱了一些代码,这实现了我想要的-但我非常欢迎提出改进意见或建议实现预期结果的更好方法

 protected QueryBuilder<T, Long> getQuery(String text, boolean wide, boolean count) {
      if (null == fields)
         reflectKeyInfo();

      QueryBuilder<T, Long> qb = null;

      if (count)
         qb = getDao().queryBuilder().setCountOf(true);
      else
         qb = getDao().queryBuilder();

      if (null == qb)
         return null;

      Where<T, Long> where = qb.where();

      boolean equals = text.contains("=") ;
      boolean like   = text.contains("~") ;

      if (equals || like)  {
         String field = null ;
         String value = null ;

         try {
            if (equals) {
               field = Strings.left(text, text.indexOf("=")) ;
               value = Strings.right(text, text.indexOf("=")) ;

               if (Strings.isValid(field) && Strings.isValid(value))
                  where.eq(field, value) ;
            }
            else
               if (like) {
                  field = Strings.left(text, text.indexOf("~")) ;
                  value = Strings.right(text, text.indexOf("~")) ;

                  if (Strings.isValid(field) && Strings.isValid(value))
                     where.like(field, "%" + value + "%") ;
               }
            }
         catch (SQLException e) {
            lastError = GlobalConfig.log(e, true) ;
            Dialogs.alert("Query Failed",
                               "<br />Unable to extract field and value from " +
                               field + "=" + value + "<br />" + lastError) ;
         }
      }
      else
         for (String field : fields.keySet()) {
            try {
               if (fields.get(field).isAssignableFrom(String.class)) {
                  if (wide)
                     where.like(field, "%" + text + "%");
                  else
                     where.eq(field, text);

                  where.or();
               }
            }
            catch (SQLException e) {
               lastError = GlobalConfig.log(e, true);
            }
         } // for
      return qb;
  }
受保护的QueryBuilder getQuery(字符串文本、布尔宽度、布尔计数){
if(null==字段)
reflectKeyInfo();
QueryBuilder qb=null;
如果(计数)
qb=getDao().queryBuilder().setCountOf(true);
其他的
qb=getDao().queryBuilder();
如果(null==qb)
返回null;
其中Where=qb.Where();
布尔等于=文本。包含(“=”);
布尔型=文本。包含(“~”);
if(等于| | like){
字符串字段=null;
字符串值=null;
试一试{
如果(等于){
field=Strings.left(text,text.indexOf(“=”);
value=Strings.right(text,text.indexOf(“=”);
if(Strings.isValid(字段)&&Strings.isValid(值))
式中.eq(字段、值);
}
其他的
如果(像){
field=Strings.left(text,text.indexOf(“~”);
value=Strings.right(text,text.indexOf(“~”);
if(Strings.isValid(字段)&&Strings.isValid(值))
其中.like(字段“%”+值+“%”);
}
}
捕获(SQLE异常){
lastError=GlobalConfig.log(e,true);
Dialogs.alert(“查询失败”,
“
无法从中提取字段和值”+ 字段+“=”+值+“
”+最后一个错误); } } 其他的 for(字符串字段:fields.keySet()){ 试一试{ if(fields.get(field.isAssignableFrom(String.class)){ 如果(宽) 其中.like(字段“%”+文本+“%”); 其他的 式中.eq(字段、文本); where.or(); } } 捕获(SQLE异常){ lastError=GlobalConfig.log(e,true); } }//为了 返回qb; }
这看起来很管用。需要考虑的一点是,你可以提交一些<代码> EQ(…)<代码> >或<代码>(…)< /COD>子句,连同<代码>何处.or(int)< /Cord>命令。因此,您需要对
eq
like
子句的数量进行计数,然后只需执行
where.or(clauseCount)
,这将使用SQL
将它们串在一起。