繁体   English   中英

Grails:使用createCriteria搜索

[英]Grails: search using createCriteria

我需要进行简单搜索(下面是我的两个示例-简单域和控制器操作)。 我想返回具有firstName,lastName或Car.carName之类的用户列表,例如searchPattern

   class User {
        String firstName
        String lastName
        static hasMany = [car : Car]
    }

    class Car {
    User user
    String carName
    }

     def list(String search){
...
     def searchPattern = "%" + search + "%"
     def domains = User.createCriteria().list(max: max, offset: offset) {
                or {
                    like("firstName", searchPattern)
                    like("lastName", searchPattern)
                    car {
                       like("carName", searchPattern)
                       }

    }
    }

它返回不正确的结果-看不到没有汽车的用户。 您能帮我更改它以使其正常工作吗? 非常感谢

试试这个:

car{
  or{
    isNull 'carName'
    like 'carName', searchPattern
  }
}

首先,您需要正确设置域类关联。 看来您要在UserCar之间建立许多关联。 有两种变体:单向和双向。 但是,您的实现都不使用。 假设您需要双向关联,则需要像下面这样修改Car类:

class Car {
    static belongsTo = [user: User]
    String carName
}

为了清楚起见,由于User有很多Car ,因此有必要使集合名称具有多个含义:

class User {
    String firstName
    String lastName
    static hasMany = [cars : Car]
}

有关协会的更多信息,您可以阅读关于该主题的文章

接下来,由于即使User没有Car也要User ,所以您应该了解GORM内置的一个微妙的默认值:SQL数据库表是自动INNER JOIN ed的。 正是此INNER JOIN导致没有CarUser被忽略。 为了解决这个问题,您需要将联接更改为OUTER JOIN 您可以执行以下操作:

import static org.hibernate.sql.JoinType.*

def domains = User.createCriteria().list(max: max, offset: offset) {
    createAlias('cars', 'c', LEFT_OUTER_JOIN)

    or {
        like("firstName", searchPattern)
        like("lastName", searchPattern)
        like("c.carName", searchPattern)
        isNull("c.carName")
    }
}

如果我记得,别名的使用方式有所不同,因此c.carName 您可以在此处阅读有关使用LEFT OUTER JOIN的更多信息。

非常感谢大家的帮助和有用的链接。 这决定了我的问题:

    import org.hibernate.criterion.CriteriaSpecification
.....

    def domains = User.createCriteria().list(max: max, offset: offset) {
    createAlias('cars', 'c', CriteriaSpecification.LEFT_JOIN)

    or {
        like("firstName", searchPattern)
        like("lastName", searchPattern)
        like("c.carName", searchPattern)
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM