Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HQL相关:如何为对象而不是字段创建ailias_Java_Hibernate_Hql - Fatal编程技术网

Java HQL相关:如何为对象而不是字段创建ailias

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

这是一个与另一个问题相关的问题:

我有几个表连接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=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();