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

时间:2017-01-04 20:53:44

标签: 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 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记录可以有一个null创建者,这是一个不同的实例。因此,当我提交查询时,我希望它找到所有具有搜索号字符串的记录或如果他们有创建者,如果创建者的名称与提交的变量匹配,请包括它们。

更新

所以我有一张包含这些记录的表格:

SearchNumber |创作者|

123 |本田|

12345 | MITSU |

45 | NULL |

我有一个搜索栏,如果他们输入:12并点击我想显示:

SearchNumber |创作者|

123 |本田|

12345 | MITSU |

如果我输入本田:

SearchNumber |创作者|

123 |本田|

如果我输入45这个:

SearchNumber |创作者|

12345 | MITSU |

45 | NULL |

由于

2 个答案:

答案 0 :(得分:0)

你正在搜索两个字段,所以你的整个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}%' 

                          )
                      )
                )

       )"""

OR中使用HQL时要注意括号 - 需要正确完成,否则会得到错误的结果。上面应该有希望解决你的问题,并强调每个或有自己的包围的重要性,但在整体更大或括号

关于joinleft join。如果创建者是域对象,则is not nullable then join is sufficient. If however it can be可以为then left join is required. In your case it can be nullable so it should be左连接。

<强> E2A 你能做println "query is $query"查看查询是否正确吗?我调整了之前给出的查询,因为你使用了单个&#34;&#34;我正在使用&#34;&#34;&#34; &#34;&#34;&#34;因为它是查询变量,我认为没有正确地进入查询,因此我的评论现在

答案 1 :(得分:0)

我对我开始工作的方式不满意。但我至少得到了我想要的实例列表:

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)