我的HQL语句如下:
[code="java"]
def hql = new StringBuffer("SELECT ci FROM CarInfo ci join ci.drivers cds WHERE 1 = 1 ")
[/code]
说明:
CarInfo : 车辆信息表
每辆车有多个驾驶员驾驶。也就是一辆车对应多个驾驶员(set),我想通过驾驶员查找所对应的车辆,条件语句如下:
[code="java"]
if(params.driverName) hql << "AND cds.account.name LIKE '%${params.driverName}%' "
[/code]
%${params.driverName}% 为页面获取的参数,即驾驶员姓名
VO如下:
CarInfo:
[code="java"]
class CarInfo implements Comparable {
String carNo // 车牌编号
String brand // 品牌
String type // 型号
Date buyDate // 购买日期
Department dept // 所属部门
byte[] photo // 照片
String photoFileName
Integer onDuty // 特殊情况下,是否值班车辆
Integer flag // 标志
Users fgLeader // 分管领导
String memo // 备注
SortedSet drivers
SortedSet carCfgs
static hasMany = [drivers : DriverInfo, carCfgs: CarCfg]
其它略。。。
}
[/code]
DriverInfo:
[code="java"]
class DriverInfo implements Comparable {
Account account
String driverLicense // 驾照类型
Integer flag
String memo
SortedSet cars
static belongsTo = CarInfo
static hasMany = [cars : CarInfo]
其它略。。。
}
[/code]
Account:
[code="java"]
class Account {
Long id
Long account
String name
String sex
String pid
String dept
String sno
String flag
其它略。。。
}
[/code]
使用的是Grails、Groovy
问题如下:
[code="java"]
Caused by: org.codehaus.groovy.grails.orm.hibernate.exceptions.GrailsQueryException: Invalid query [SELECT ci FROM CarInfo ci join ci.drivers cds WHERE 1 = 1] for domain class [class CarInfo]
at CarInfoService.getList(CarInfoService.groovy:18)
at CarInfoService$$FastClassByCGLIB$$4df581d3.invoke()
at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
at CarInfoService$$EnhancerByCGLIB$$9ec3182d.getList()
at CarInfoService$getList.call(Unknown Source)
at CarInfoController$_closure2.doCall(CarInfoController.groovy:21)
at CarInfoController$_closure2.doCall(CarInfoController.groovy)
[/code]
改为left join 和 right join都不行!请教hibernate高手。
而另外一个放到子查询里的join就可以执行,代码如下:
[code="java"]
def hql = new StringBuffer("FROM Account a WHERE TRIM(a.sno) IS NOT NULL ")
if(params.carNo) hql << "AND TRIM(a.id) IN (SELECT di.account.id FROM DriverInfo di join di.cars cs WHERE cs.carNo LIKE ('%${params.carNo}%')) "
[/code]