如何只获取在 grails 中设置了一些值但不是列表的字符串的一个值?
How to get only one value of a String that have set some values in grails and is not a list?
我的数据库中有一列具有此值 "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
提前致谢
这些默认函数如 findBySomething()
仅适用于精确值。因为它们被转换为 Hibernate 查询,并且在查询中它检查对象的值是否等于传递的值。
但是 Grails 有一个叫做 criteria 的东西,如果我理解正确(你想要包含你传递的字符串的域值),你应该这样做:
def results = MyDomain.createCriteria().list{
ilike("name", "%"+myName+"%")
}
还有
我不明白你想要实现什么,但这个结构看起来不太好(将可能的值存储在这样的字符串中)
简介
尽管现有问题只有一个答案,正如@tim_yates 指出的那样,使用我的答案以及您设置域的方法 class 并不是最好的
如何在域中设置列表
Grails 域 classes 有 hasMany selector,因此您的域 class 应该如下所示:
class MyDomain {
static hasMany = [names: String]
List names
}
如何添加名字
当拥有域对象并想向列表中添加另一个名称时,可以使用 myDomainObject.addToNames(thename)
如何按名称检索
正如我之前所说,这需要 createCriteria() :
def results = MyDomain.createCriteria().list{
"in"("names",someName)
}
这将 return 所有域对象的列表。如果你想从他们那里得到一些数据,你可以使用 each
循环并使用 it
引用一个项目:
results.each{
println it.names
}
您也可以尝试这样做:
MyDomain md = MyDomain.findByName("%" + myName + "%")
查看文档:https://grails.github.io/grails-doc/2.4.4/ref/Domain%20Classes/findBy.html
我的数据库中有一列具有此值 "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
提前致谢
这些默认函数如 findBySomething()
仅适用于精确值。因为它们被转换为 Hibernate 查询,并且在查询中它检查对象的值是否等于传递的值。
但是 Grails 有一个叫做 criteria 的东西,如果我理解正确(你想要包含你传递的字符串的域值),你应该这样做:
def results = MyDomain.createCriteria().list{
ilike("name", "%"+myName+"%")
}
还有
我不明白你想要实现什么,但这个结构看起来不太好(将可能的值存储在这样的字符串中)
简介
尽管现有问题只有一个答案,正如@tim_yates 指出的那样,使用我的答案以及您设置域的方法 class 并不是最好的
如何在域中设置列表
Grails 域 classes 有 hasMany selector,因此您的域 class 应该如下所示:
class MyDomain {
static hasMany = [names: String]
List names
}
如何添加名字
当拥有域对象并想向列表中添加另一个名称时,可以使用 myDomainObject.addToNames(thename)
如何按名称检索
正如我之前所说,这需要 createCriteria() :
def results = MyDomain.createCriteria().list{
"in"("names",someName)
}
这将 return 所有域对象的列表。如果你想从他们那里得到一些数据,你可以使用 each
循环并使用 it
引用一个项目:
results.each{
println it.names
}
您也可以尝试这样做:
MyDomain md = MyDomain.findByName("%" + myName + "%")
查看文档:https://grails.github.io/grails-doc/2.4.4/ref/Domain%20Classes/findBy.html