我的数据库中有一列具有此值" 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
提前致谢
答案 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