2011-12-01 491 views
3

假设一个名为的用户类别为的域类。 用户类看起来是这样的:如何使用like操作符在GORM中的字符串集合上进行查询

class User { 
    List<String> values 
} 

收集包含像 “http://example.com/x”, “http://google.com/y”,“HTTP字符串: //google.com/z“等等......

比方说,我们想要构建一个查询,获取集合(例如”google.com“)中具有特定字符串的所有用户。类似这样的:

def criteria = User.createCriteria() 
def results = criteria.listDistinct() { 
    and { 
    user.values.each { like('someField', '%${it}%') } 
    } 
} 

任何想法?

+0

您应该将您的答案作为实际答案发布并接受它。 –

+0

我认为标准生成器的'in'谓词可能导致更简洁的解决方案 –

回答

2

我已经通过实验找到了答案。解决的办法是:

def criteria = User.createCriteria() 
def results = criteria.listDistinct() { 
    and { 
    user.values.each { like('someField', '%'+it+'%') } 
    } 
} 
+1

这很好,是我见过的唯一解决方案,它是:我有一个字符串数组,这是搜索中的关键字,并且我需要在AND块中为他们做一个相似的条件。希望我能更多地赞扬这一点! –

+0

嗨Ondrej,什么是somefield。 Bz是字符串清单吗?请解释一下。 – Visme

+0

嗨。在这种情况下,“someField”代表“user.values”中的值。我想你可以任意命名它...... –

0

我不确定你在做什么与你的建议答案。 我从来没有在标准查询中看到过每种用法。

这个问题之前已经被问了很多次,但从未给出答案。 问题是你正在查询一个String关联,它不是一个域类。你若想例如ondrej.String自己的字符串域类{字符串strValue中}那么你就能够做到:

User.withCriteria { 

values { ilike("strValue", "...") } 

} 

问题是没有访问String对象的值。 String类的值称为价值,但它是一个字符数组,所以我不相信下面的工作:

User.withCriteria { 

values { ilike("value", "...") } 

} 

你可以尝试使用:

User.withCriteria { 

values { ilike("toString", "...") } 

} 

或别的东西代替toString ...我现在没有可能测试这个。

希望有帮助

+0

谢谢,但我想用某个字段/变量替换“...”。例如用户用户=新用户(“名称”); User.withCriteria {like(“name”,user.getName())} };所以解决方案是:'%'+ user.getName()+'%' –

0

了很多尝试和研究后,我发现这将使用Grails 2.4.0工作,我不知道旧的版本。

Cat.withCriteria { 
    createAlias('nicknames', 'n') 
    ilike 'n.elements', '%kitty%' 
} 

诀窍是使用'n。 elements'