【问题标题】:Grails / GORM withCriteria search toString()Grails / GORM withCriteria search toString()
【发布时间】:2014-10-03 09:55:31
【问题描述】:

我正在显示一个带有Userobjects 的表格。显示的信息是:

User.firstName
User.lastName
User.email

但使用 user.toString() 显示,导致以下输出:

Gordon, Tomas (gordon.tomas@company.com)
Hanks, Jessica (hanks.jessica@company.com)

我想在此列表上设置一个过滤器,以允许人们搜索特定用户。这些是要求:

1) 1 search field only
2) generic text input

目前我执行以下操作来更新列表,其中owner 是输入:

def user // input as string from the search field

def potentialUsers = User.withCriteria {
        or {
            ilike("firstName", '%' + user + '%')
            ilike("lastName", '%' + user + '%')
            ilike("email", '%' + user + '%')
        }
    }

当有only 1 word 输入时,这非常有效。

但我希望人们会这样搜索:

  • '汤姆'
  • '戈登·托马斯'
  • 'jessica@company hanks'
  • '托马斯·戈登'
  • ...等等

在我看来,最好的解决方案是直接在toString() 中搜索,但我还没有弄清楚该怎么做..

关于如何正确过滤的任何想法?

【问题讨论】:

    标签: java hibernate grails filter grails-orm


    【解决方案1】:

    基本上你有两个选择:快速或正确。

    快速)将一个字段添加到您的域类以包含您要搜索的字段值的串联,例如User.concatenated = 'Gordon Tomas gordon.tomas@company.com'。然后你可以触发你的搜索:

    def potentialUsers = User.withCriteria {
      user.split( /\s+/ ).each{  
        ilike 'concatenated', '%' + it + '%'
      }
    }
    

    正确)使用Lucene 或基于Lucene 的适当全文搜索框架,如hibernate-searchgrails search pluginelastic search 来索引您的字段,因此您可以触发复杂的多词查询

    【讨论】:

    • 谢谢。第一种方法肯定太丑了;)我会尝试其中一个插件。你会推荐哪个经验?
    • 这取决于您的需求的复杂性。我从适合简单任务的searchable plugin 开始,然后转而直接使用 Lucene API
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多