关于hibernate一对多的查询问题(join的使用)!

我的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]

1个回答

SELECT ci FROM CarInfo ci join ci.drivers cds WHERE 1 = 1
--》
from CarInfo ci left join fetch ci.drivers where 1=1

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问