按字段A查询,如果字段B不为空,也按字段B查询HQL grails

按字段A查询,如果字段B不为空,也按字段B查询HQL grails,grails,hql,Grails,Hql,所以我有一个疑问: "from ProductLookupNumber pln left join pln.creator as creator where (pln.searchNumber like '%" + query + "%') or (creator is not null and creator.name like '%" + query + "%')" 我使用的是grails,但出于某种原因,无论我在提交查询变量的输入字段中写了什么,它都返回空 下一个查询工作正常。但我不能

所以我有一个疑问:

"from ProductLookupNumber pln left join pln.creator as creator
where (pln.searchNumber like '%" + query + "%') 
or (creator is not null and creator.name like '%" + query + "%')"
我使用的是grails,但出于某种原因,无论我在提交查询变量的输入字段中写了什么,它都返回空

下一个查询工作正常。但我不能按创造者的名字过滤:

from ProductLookupNumber pln where (pln.searchNumber like '%" + query + "%')
此其他查询过滤所有没有创建者的记录:

"from ProductLookupNumber pln " +
"where (pln.searchNumber like '%" + query + "%') " +
"or (pln.creator is not null and pln.creator.name like '%" + query + "%')"
问题是一些ProductLookupNumber记录可以有一个空的创建者,这是一个不同的实例。因此,当我提交一个查询时,我希望它能找到所有具有搜索编号字符串的记录,或者如果它们有创建者,则在创建者的名称与提交的变量匹配时将其包括在内

更新:

因此,我有一个包含这些记录的表格:


SearchNumber |创建者| 123 |本田| 12345 | MITSU| 45 |零| 我有一个搜索栏,如果他们键入:12并单击,我想显示以下内容:


SearchNumber |创建者| 123 |本田| 12345 | MITSU| 如果我键入以下内容:


SearchNumber |创建者| 123 |本田| 如果我输入45这个:


SearchNumber |创建者| 12345 | MITSU| 45 |零|
谢谢,您正在搜索两个字段,因此您的整个where语句都在括号中,或者必须在括号中,都是这个或那个或这个情况,并且都需要适当的括号-注意下面的注释和间距以进行解释

   def query =  """from ProductLookupNumber pln left join pln.creator creator
     //Entire thing around brackets here
    where  (  
             //first check
             (pln.searchNumber like '%${query}%' ) 
             // or it is over to creator
             or 
               //creator is null when you search for 45 it returns null
               (creator is null 
                 // or creator is not null and is :
                   or (
                          //is not null and name matches query
                          (
                            creator is not null and 
                             creator.name like '% ${query}%' 

                          )
                      )
                )

       )"""
HQL
中使用
时,请注意括号-需要正确执行,否则会得到错误的结果。以上内容有望解决您的问题,并强调每个or如何有自己的括号,但在整体上更大的or括号中的重要性

关于
连接
左连接
。如果creator是一个域对象,并且
不可为空,那么join就足够了。但是,如果它可以是
null
,则需要左连接。在您的情况下,它可以为null,因此它应该是
left join`

E2A
您能否执行
println“查询是$query”
以查看查询是否正确?。我对前面给出的查询进行了调整,因为您使用了单个“”,而我使用的是“”,因此我认为这是一个查询变量,没有正确地放入查询中,因此我现在发表了评论,我对它的工作方式不满意。但我至少得到了我想要的实例列表:

def where_query = ProductLookupNumber.where {
    searchNumber =~ "%${query}%" || creator.name =~ "%${query}%"
}
def list = where_query.list()
def list2 = criteria.list {
    isNull('creator')
    like("searchNumber", "%${query}%")
}
list.addAll(list2)

它也没有显示任何记录。我开始认为问题可能不是查询,而是视图需要一个实体列表,而查询返回的是其他内容。我们可以添加println“${results}”或从hql捕获结果的任何内容来查看它是什么,或者println“${results.size()}”${results}=[[123_123AB-25本田,本田],[1225-12-25三菱,三菱]]和“${results.size()}”=2 Son我不仅丢失了实例,而且它还在过滤没有创建者的实例。creator中的
name
只是默认的数据类型,比如String,或者name是域类中的另一个对象吗?很难回答您的问题,因为不确定现有标准是什么-创建者是其中的一部分吗?您希望那些没有创建者记录的以及那些以创建者和创建者为名称的吗?我已经更新了查询-也许上面的内容更符合您的要求是的,名称是一个字符串。我将更新我的问题,以尝试更清楚地显示场景。新的查询也不起作用${results}=[[12345 null,null]]和“${results.size()}”=1您是否可以共享产品查找编号的域类,特别是您离开的创建者声明在一种情况下加入,在另一种情况下直接查询请查看我的答案并修复您的问题或删除它,并花更多时间询问编辑器“ate”空白处。我想要实现的目标现在应该更清楚了