[英]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
}
}
首先,您需要正确设置域类关联。 看来您要在User
和Car
之间建立许多关联。 有两种变体:单向和双向。 但是,您的实现都不使用。 假设您需要双向关联,则需要像下面这样修改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导致没有Car
的User
被忽略。 为了解决这个问题,您需要将联接更改为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.