Ormlite就像在字段地图上查询一样

问题描述 投票:0回答:1

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

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

我可以使用queryBuilder()获得一个KNOWN类.where()。like(...)但是,我想为所有子类构建一个通用的动态函数。

我的所有持久化类都派生自“持久”基类,它具有一些基本的内务处理,处理单个对象的存储和删除。这是我放置“find”函数的地方,它理想地返回Iterator或List <T>,最好是Iterator。

我已经为所有DatabaseField带注释的字段获得了Map <String,DataType>。现在,我只想在字段Y中的任何地方出现“粗暴”力字符串“X”。我将找出数据类型转换并稍后检查。如果我可以动态构建查询,那么我可以在下一个版本中解决数据类型问题。

我已经看过将地图作为参数的方法,它们是一个狭窄的匹配,即所有必须匹配。我正在寻找相反的情况:任何比赛都可以。

我能想到的唯一方法是构建单独的“like”组件并将它们组合成一个更大的语句,从文档中,我无法弄清楚如何动态地这样做。

欢迎任何建议。

mapping ormlite
1个回答
0
投票

好吧,我已经搞砸了一些代码,这实现了我想要的 - 但我非常欢迎评论改进或建议更好的方法来实现预期的结果。

 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;
  }
© www.soinside.com 2019 - 2024. All rights reserved.