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 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd
  • ¥20 ING91680C BLE5.3 芯片怎么实现串口收发数据
  • ¥15 无线连接树莓派,无法执行update,如何解决?(相关搜索:软件下载)
  • ¥15 Windows11, backspace, enter, space键失灵