关于Hql

public class A {
    private Long id;
    private String name;
    private B b;
}
public Class B{
    private Long id;
    private String className;
}

当我们用sql写左连接的时候会有这样的语句.

select a.* from A a left join B b on a.b.id = b.id where b.id = ?

如果B是A的属性,那么当写hql的时候就应该这样写

select a from A a left join a.b c where  a.b.id = c.id and c.id = ?

这里要说的有几点,

1. hql不支持* ,当我们写select a.*的 时候会抛异常,org.hibernate.hql.ast.QuerySyntaxException: expecting IDENT, found '*' near line 1, column 12......

2. 此处左连接不能用on做条件,要用where,否则会抛异常org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 93......

3. 左连接的右边应该写a.b 而不是写B.也就是说要写A自己的属性b

4. select 条件要写成select a 而不能是select a.id, a.name, a.b from ,这样写不会得到A对象的list,当迭代list使用a对象的时候会抛出类型转换异常 java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值