【问题标题】:And/Or query conditions in Criteria with Grails和/或使用 Grails 在 Criteria 中查询条件
【发布时间】:2021-08-25 12:26:02
【问题描述】:

我正在尝试使用 Hibernate Criteria 从数据库中查询一些数据信息,查询需要检查从前端动态获取的数据,所以我必须迭代一个列表并在何时生成和/或条件查询,但我没有得到任何结果。

这是我实际最接近的方法:

if (params."chartsForm[tickets][]" != null) {
                    def tickets = params."chartsForm[tickets][]"
                    (and {
                        def ticket = tickets[0]
                        ilike("ticketCode", "$ticket%")

                        for (def i = 1; i < tickets.size(); i++) {
                            (or {
                                ticket = tickets[i]
                                ilike("ticketCode", "$ticket%")
                            })
                        }
                    })
                }

任何人都知道如何做到这一点或我错过了什么?

【问题讨论】:

  • 虽然这不能直接回答您的问题,但请尝试使用静态值通过显式查询将其分解,以确保您获得结果。如果您无法判断查询中发生了什么,请打开开发中的 SQL 日志记录,默认为 org.hibernate.SQL。调试级别的日志记录将给出 SQL 查询。 Trace 会添加参数值。

标签: hibernate grails criteria


【解决方案1】:

编辑添加:我没有解决您查询的一般结构或逻辑或循环的明显问题。只是解决为什么结果似乎与您的期望不符。如果这是您使用的实际查询,而不仅仅是 StackOverflow 的示例,那么...我不知道,还有很多其他建议。

我不清楚您的查询要查找什么。但我认为你的 or 子句放错了地方。而且它只有一个项目,所以它什么都不做。

给定输入

ticket[0]="fus"
ticket[1]="roh"
ticket[2]="dah"

您的查询最终将是:

and {
  ilike("ticketCode", "fus%")
  ilike("ticketCode", "roh%")
  ilike("ticketCode", "dah%")
}

这将返回零结果,因为您要在同一字段上查找三个不同的值。

and 子句意味着块中的所有内容都必须匹配。嵌套的 or 将与顶层块中的所有内容“和”。

转换为 SQL,如下所示:

WHERE ticketCode LIKE "fus%" AND (ticketCode LIKE "roh%" OR <some other statement if you added it>) AND (ticketCode LIKE "dah%" OR <...>)

注意ors 仍然是ands 的一部分(为了清楚起见,我添加了“额外的东西”,否则查询中将没有“OR”)

编辑:更可靠的描述

【讨论】:

    猜你喜欢
    • 2015-01-16
    • 1970-01-01
    • 2011-09-08
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多