如何只获取一个在grails中设置了一些值并且不是列表的String的值?

时间:2016-04-26 12:46:51

标签: grails gorm

我的数据库中有一列具有此值" Bob; Steve; Fred"。这个列是一个字符串(不是列表),我希望能够构建一个查询,为我提供我通过参数的值。

这是我的域名:

String name (values that contain name is: Bob;Steve;Fred)

我尝试做的是构建一个查询,只获取我在方法中传递的名称:

这是我的方法,我试图这样做:

def updateName(String myName) {
    MyDomain md = MyDomain.findByName(myName)
    if (!md) {
       log.warn "name not found [" + name+ "]"
    }

}

有了这个,我总是md = null;

我想要的是,例如。如果我传递myName = Bob我想要的是在我的字符串名称中找到有三个名字的Bob(Bob; Steve; Fred):

 MyDomain md = MyDomain.findByName(Bob)
 md should be = Bob

提前致谢

3 个答案:

答案 0 :(得分:1)

findBySomething()这些默认函数仅适用于精确值。因为它们被转换为Hibernate查询并且在查询中它检查的是object的值等于传递的值。
但是 Grails有一个名为criteria的东西,如果我理解正确(你希望域值包含你传递的字符串),你应该这样:

def results = MyDomain.createCriteria().list{
    ilike("name", "%"+myName+"%")
}


另外
我没有得到你想要达到的目标,但这种结构看起来并不好(将可能的值存储在类似的字符串中)

答案 1 :(得分:0)

<强> INTRO
虽然现有问题有一个答案,正如@tim_yates指出的那样,使用我的答案可能存在问题以及设置域类的方法不是最好的
如何在域中设置列表
Grails域类有hasMany selector,因此您的域类应如下所示:

class MyDomain {
    static hasMany = [names: String]
    List names
}

如何添加姓名
拥有域对象并希望在列表中添加其他名称时,可以使用myDomainObject.addToNames(thename)

如何按名称检索
正如我之前所说,这需要createCriteria():

def results = MyDomain.createCriteria().list{
    "in"("names",someName)
}

这将返回所有域对象的列表。如果您想从中获取一些数据,可以使用each进行循环,并使用it引用一个项目:

results.each{
    println it.names
}

答案 2 :(得分:0)

您也可以尝试这样做:

MyDomain md = MyDomain.findByName(“%”+ myName +“%”)

检查文档:https://grails.github.io/grails-doc/2.4.4/ref/Domain%20Classes/findBy.html