Grails GORM“或”不与关联一起工作

2024-01-12

在下面的示例中,我希望 Product.searchAll 能够匹配两者 添加剂和产品,但似乎忽略了eq('name', taste).

class Additive {
    String flavor
    static belongsTo = [product:Product]
}

class Product {
    String name
    static hasMany = [additives:Additive]

    static constraints = {
            name nullable:true
    }

    static namedQueries = {
        searchAll { taste ->
            or {
                eq('name', taste)
                additives { eq('flavor', taste) }
            }
        }
        searchAdditives { taste ->
            additives { eq('flavor', taste) }
        }
        searchProducts { taste ->
            eq('name', taste)
        }
    }
}

class SearchSpec extends grails.plugin.spock.IntegrationSpec {
    def choc, muff

    def 'searchAll should return products and additives that match - THIS FAILS'() {
        setup:
            createTestProducts()
        expect:
            Product.searchAll("chocolate").list() == [choc, muff]
    }


    def 'searchProducts should return only products that match - THIS PASSES'() {
        setup:
            createTestProducts()
        expect:
            Product.searchProducts("chocolate").list() == [choc]
    }

    def 'searchAdditives should return only additives that match - THIS PASSES'() {
        setup:
            createTestProducts()
        expect:
            Product.searchAdditives("chocolate").list() == [muff]
    }

    private def createTestProducts() {
        // create chocolate
        choc = new Product(name:'chocolate').save(failOnError:true, flush:true)
        // create a chocoloate-flavored muffin
        muff = new Product(name:'muffin').addToAdditives(flavor:'chocolate').save(failOnError:true, flush:true)
    }
}

生成的SQL如下:

select this_.id as id1_1_, this_.version as version1_1_,
this_.name as name1_1_, additives_1_.id as id0_0_,
additives_1_.version as version0_0_, additives_1_.flavor as
flavor0_0_, additives_1_.product_id as product4_0_0_ from product
this_ inner join additive additives_1_ on
this_.id=additives_1_.product_id where (this_.name=? or
(additives_1_.flavor=?))

我的语法有问题吗?还是 Grails、GORM 或 H2 的问题?


我的猜测是,快速查看您的查询,Grails / GORM 正在执行inner join。仅当表之间存在关系时,内部联接才匹配。在上面的示例中,该查询将never match choc, 因为choc不含任何相关添加剂。

所以,这不是or这是失败的,这是实际的查询。火起来本地主机:8080/{yourapp}/dbConsole并运行相同的查询,但没有where陈述。您应该看到您只能获得含有一种或多种添加剂的产品。

我相信(未经测试)你可以强制LEFT JOIN使用这样的语法:

import org.hibernate.criterion.CriteriaSpecification
...

    searchAll { taste ->
        createAlias("additives", "adds", CriteriaSpecification.LEFT_JOIN)
        or {
            eq('name', taste)
            eq('adds.flavor', taste)
        }
    }

这应该强制左(或外)连接,允许没有匹配添加剂的产品。注意:使用外连接时可能会得到重复的结果,但这取决于您的特定使用场景。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Grails GORM“或”不与关联一起工作 的相关文章

随机推荐

  • 将 UIView 绕其中心旋转几次

    我正在尝试旋转一些UIView围绕它的中心 所以简单的代码是这样的 伪代码 UIView beginAnimations crazyRotate context nil UIView setAnimationDuration 1 0 som
  • 如何在 Python 中让用户选择要更新的键,然后选择新值来更新字典值?

    我正在尝试编写一个程序 我和我的兄弟可以输入和编辑足球比赛名单中的信息 以比较球队和管理球员等 这是我尝试过的第一个 大 项目 我在字典中有一个嵌套字典 我可以让用户创建字典等 但是当我尝试让 用户 通过 raw input 返回编辑它们时
  • Kubernetes:minikube 持久卷本地文件系统存储位置

    我已经阅读了所有文档和一些 SO 帖子 但找不到这个问题的答案 minikube 将其持久卷保存在我的本地 Mac 文件系统中的什么位置 Thanks 首先请记住 Kubernetes 运行在Minikube https minikube
  • NodeJS Express req.session 未定义

    就是想不通这个 我发现的关于快速会话的所有内容都表明它确实有效 但对我来说并非如此 我的整个应用程序配置 app configure gt app set port process env PORT 3000 app set views p
  • 通过同级子视图传播触摸事件?

    我有一堆子视图 它们都有用户交互部分 子级 并且全屏 问题是 如果我触及堆栈顶部的非交互式部分 它不会将该触摸传播到堆栈的其余部分 我的设置 视图A view B 全屏容器 本身不是交互式的 但具有交互式子视图 视图B1 互动 查看B2 互
  • 以编程方式向 Woocommerce 3.2+ 中的订单添加折扣

    在 woocommerce 中 我们可以使用优惠券功能为任何订单添加折扣 固定金额 百分比金额 是否可以以编程方式向任何订单添加折扣金额 其中折扣金额可以是任意金额 任何帮助将不胜感激 以编程方式为订单提供折扣的唯一可用功能 正在欺骗Fee
  • 控制器未收到英国格式的 MVC3 日期

    给定这个虚拟机 public class ApplicationDTO BaseDTO public DateTime Date get set public int JobId get set public int Status get
  • WPF 动画/UI 功能性能和基准测试

    我正在为某些业务线的一些奇特的 WPF UI 工作做一个相对较小的概念验证 即使没有太疯狂 我在使用许多功能时已经看到一些非常糟糕的性能 我认为这些功能是首先考虑使用 WPF 进行 UI 构建的主要原因 我在这里问了一个问题 为什么我的动画
  • Spring WS WebServicesTemplate/Jaxb2Marshaller 客户端查看原始 xml?

    是否可以使用 WebServicesTemplate 和 Jxb2Marshaller 作为编组引擎来查看 Spring WS 客户端的请求和响应 我只是想记录 xml 而不是对原始 xml 执行任何操作 See the spring ws
  • 核心数据:在实体 中未找到键路径错误

    谁能告诉我这段代码有什么问题吗 它会引发以下错误并导致应用程序崩溃 reason keypath Studies patients PatientName not found in entity
  • 如何让 babelify 10 定位浏览器

    我想要的是 使用最新版本的库 让它在 IE 11 中运行 我正在构建一个 React 应用程序 为了运行测试 我需要 testing library react 为了在浏览器中运行测试 我需要 browserify 为了在我支持的每个浏览器
  • main.js:2 Uncaught Referenceerror: firebase 未定义 [重复]

    这个问题在这里已经有答案了 我正在尝试将我的 html 联系表单与 firebase 链接 但遇到错误 未捕获的引用错误 firebase 未定义 在我的 main js 文件中 我在 html 文件中很好地定义了 CDN 但在 main
  • 什么是 Swift 中的部分应用闭包#1

    我试图理解此崩溃报告 但无法理解 因为函数 applySettings 不是从 init 调用的 如崩溃报告中所示 Swift 中的 部分申请closure 1 是什么 这是 init 函数所需的代码 public override ini
  • 位置:修复Chrome Mobile中的滑动bug

    如果您查看我的网站 http alexander pastor de在手机上的 Chrome Mobile 中 向任何方向滚动时 页脚都不会保持原样 对原因或解决方法有什么想法吗 页脚的 CSS 代码如下所示 footer width 10
  • 我可以对 GroupTemplate 或 ItemTemplate 进行编号吗?

    我想使用 GroupTemplate 将项目列表分成组 但是 我需要按顺序对每个组进行编号 以便我可以链接到它们并实现一些 JS 分页 我正在绑定到 IEnumerable 这是一些伪代码 我希望输出看起来像这样 a href group1
  • 如何 grep 查找所有少于 4 个字符的单词?

    我有一本字典 单词之间用换行符分隔 你可以这样做 egrep x 1 3 myfile 这也会跳过空白行 从技术上讲 空白行不是单词 不幸的是 上面的正则表达式会将缩写中的撇号计为字母 并将连字符复合词中的连字符计为字母 在字母数如此少的情
  • Python 中 minidom 的内存错误

    我在 Python 中遇到了带有 minidom 解析器的 MemoryError 我正在读取 8000 个小文件 大部分小于 50 Kb 在读取 2500 个后出现此错误 Traceback most recent call last F
  • Mysql为json类型列设置默认值

    我听说8 0 13之前的mysql版本接受json类型列的默认值 所以我使用cmd ALTER TABLE templates CHANGE COLUMN values JSON NOT NULL DEFAULT 但收到错误 Error C
  • ASP.Net 控件与 HTML 控件性能

    我听说我们应该避免使用默认 ASP Net 控件 因为它们在 Viewstate 等方面很重要 因此 每当我只想显示信息时 我就考虑使用 HTML 标签 并使用 Eval 函数在 href 或 src 属性中插入服务器端代码 但我也听说 E
  • Grails GORM“或”不与关联一起工作

    在下面的示例中 我希望 Product searchAll 能够匹配两者 添加剂和产品 但似乎忽略了eq name taste class Additive String flavor static belongsTo product Pr