Java HQL相关:如何为对象而不是字段创建ailias
这是一个与另一个问题相关的问题: 我有几个表连接hql。表格如下所示:Java HQL相关:如何为对象而不是字段创建ailias,java,hibernate,hql,Java,Hibernate,Hql,这是一个与另一个问题相关的问题: 我有几个表连接hql。表格如下所示: A - A_ID - NAME B - B_ID - A_ID C - C_ID - B_ID - LENGTH - UNIT 课程: @Entity @Table(name="A") class A { @Id @Column(name="A_ID", updatable=false) private Long id; @Column(name="NAME", nullable=f
A
- A_ID
- NAME
B
- B_ID
- A_ID
C
- C_ID
- B_ID
- LENGTH
- UNIT
课程:
@Entity
@Table(name="A")
class A
{
@Id
@Column(name="A_ID", updatable=false)
private Long id;
@Column(name="NAME", nullable=false, length=10, updatable=false)
private String name;
@OneToMany(mappedBy="a", fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name="A_ID", nullable=false)
private Set<B> bs;
// Setters and getters
...
}
@Entity
@Table(name="B")
class B
{
@Id
@Column(name="B_ID", updatable=false)
private Long id;
@ManyToOne
@JoinColumn(name="A_ID", nullable=false, insertable=true, updatable=false)
private A a;
@OneToMany(mappedBy="b", fetch=FetchType.LAZY, cascade={CascadeType.ALL})
@JoinColumn(name="B_ID", nullable=false)
private Set<C> cs;
@Transient
private Double length;
@Transient
private String unit;
// Setters and getters
...
}
@Entity
@Table(name="C")
class C
{
@Id
@Column(name="C_ID", updatable=false)
private Long id;
@ManyToOne
@JoinColumn(name="B_ID", nullable=false, insertable=true, updatable=false)
private B b;
@Column(name="LENGTH", nullable=false, updatable=false)
private Double length;
@Column(name="UNIT", nullable=false, length=10, updatable=false)
private String unit;
// Setters and getters
...
}
现在的问题是:
我不知道如何设置HQL中返回的B对象中A的别名。当我这样做时,这会导致NPE:
b.getA().getName();
因为我不知道如何将相关对象“A”设置为“B”,因为B表中只有一个ID
请帮忙。非常感谢。b.getA().getName()
这将抛出一个NPE,因为选择b.id作为id,选择sum(c.length)作为长度,选择min(c.unit)作为b的单位b
不包括a
。当您在HQL查询中使用select子句时,它将只返回前面提到的字段
有关更多信息,请参阅
编辑:
如果您通读了提供的文档,您会看到从cat中选择cat.mate
。这可以合并到您的查询中。在select子句中添加b.A
,它应该会起作用
编辑:
如果选择b.id作为id,sum(c.length)作为长度,min(c.unit)作为单位
从B到B
左外接头b.c为c
按b.id分组
那就工作吧
选择b.id作为id,sum(c.length)作为长度,min(c.unit)作为单位,b.A
从B到B
左外接头b.c为c
按b.id、b.A分组
也应该如此。您这里的别名到底是什么意思?很抱歉,我不太明白…很抱歉搞混了。这里的“别名”是指从“A”对象到“B”对象中的字段的映射。我不能把A放在“选择”部分,因为它不在“分组依据”条件下。是的,我知道原因。但我不知道如何在HQL中“提及”A。我将阅读您提供的文档,如果您能告诉我如何修改hql,我将不胜感激。非常感谢。事实上,我已经读了很多次那个文档,但我仍然不知道怎么做。把“b.A”放在select子句中不会有帮助,因为我有一个“group by”子句,它要求我把所有字段都放在select子句中。我的HQL和SQL最好都生锈了,所以把b.A添加到group by子句中有什么问题吗?哈哈,我知道你会问这个问题的。事情是这样的:1。如果将b.A放入select子句中,在将hql解析为sql时,它会将A的所有字段添加到select子句中。2.如果将b.A放入GROUPBY子句,则在解析它时,它只会将A.id添加到GROUPBY子句中。这意味着select子句中的字段比group by中的字段多。翻译的sql不正确,无法使用。
b.getA().getName();