Leon1509 2009-09-09 10:57
浏览 275
已采纳

关于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条回答 默认 最新

  • iteye_18964 2009-09-10 14:26
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 python验证码滑块图像识别
  • ¥15 QT6颜色选择对话框显示不完整
  • ¥20 能提供一下思路或者代码吗
  • ¥15 用twincat控制!
  • ¥15 请问一下这个运行结果是怎么来的
  • ¥15 单通道放大电路的工作原理
  • ¥30 YOLO检测微调结果p为1
  • ¥15 DS18B20内部ADC模数转换器
  • ¥15 做个有关计算的小程序
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)