gpt4 book ai didi

grails - Grails:如何通过命名查询和其他条件关闭来获取单个项目

转载 作者:行者123 更新时间:2023-12-02 14:42:48 24 4
gpt4 key购买 nike

我正在使用Grails 2.4.3,并且在命名查询时遇到麻烦。

例如我有这个

class Product {
Customer customer
...
static namedQueries = {
byCustomer { Customer c ->
eq('customer', c)
}
}
...
}

现在我可以做
Product.byCustomer(customer).list()

我可以做
Product.byCustomer(customer).list(pagination + sorting ) {
...
gt('price', 23.5)
}

如果我要从gorm中带有标准的单个对象,通常
Product.createCriteria().get {
....
eq('name', 'foo')
}

这将返回名称=='foo'的第一个匹配产品

现在,我要做的是:
Product.byCustomer(customer).get {
...
eq('type', 'bar')
}

这给了我:
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server       
version for the right syntax to use near 'from product this_)' at line 1. Stacktrace follows:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax;
check the manual that corresponds to your MariaDB server version for the right syntax to use near
'from product this_)' at line 1

我也尝试过这个:
Product.byCustomer(customer) {
...
eq('type', 'bar')
}.get()

这也不起作用,因为byCustomer(...)返回一个集合。

我在这里想念什么?我真的想知道导致除.get()之外的所有其他方法似乎都可以工作:
Product.byCustomer(customer).count {
...
eq('type', 'bar')
}

(这正在工作)

我非常感谢您的帮助。谢谢!

更新:

如前所述,如果您只想查询一组固定的属性,则有几个选项:

使用where子句:
Product.byCustomer(customer).findWhere([type: 'bar'])    

用另一个命名查询“类型”
Product.byCustomer(customer).byType('bar').get()

问题:我具有一组要添加的动态条件-无法为我的域类中的所有属性创建命名查询。

更新2:

示例我如何根据条件基于条件动态构建:
Product p = Product.byCustomer(customer).get() {

if (condition) {
eq('a', params.int('bar'))
gt('b', params.int('foo'))
items {
eq('c', 'baz')
}
} else {

...

}
}

回答

我想我找到了适合我的方式。当我使用Grails> 2.0时,我可以使用
where-queries将返回 DetachedCriteria

DetachedCriteria具有缺少的get()方法,我什至可以将findWhere-类似于语法与构建器语法混合- checkout :
Product.where { foo == '5' && bar > 8 }.get()

要么
Product.where { foo == '5' && bar > 8 }.build {
items {
eq('baz', 5)
}
}.get()

在两个闭包中(其中+ build),我都可以动态添加条件。

现在最后一部分-重用上述查询中已经存在的namedQueries
Product.where { foo == '5' && bar > 8 }.build {
items {
eq('baz', 5)
}

Product.byCustomer(customer)
}.get()

甜!不幸的是,我还不能回答自己的问题:)

更新

最后一部分不起作用。如何混合DetachedCriteria和命名查询?

最佳答案

由于带有闭包参数的命名查询的结果是java.util.ArrayList,因此您应该能够

Product.byCustomer(customer){
...
eq('type', 'bar')
}.getAt(0)

如果结果为空列表,则将返回 null,否则将返回第一个条目(在您的情况下为唯一)。尝试使用Grails 2.4.3。

关于grails - Grails:如何通过命名查询和其他条件关闭来获取单个项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25672125/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com