Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.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和sum(),first()_Java_Hibernate_Hql - Fatal编程技术网

Java 多表连接的HQL和sum(),first()

Java 多表连接的HQL和sum(),first(),java,hibernate,hql,Java,Hibernate,Hql,塔尔贝斯: 类(此处省略注释): 我想写一个hql来获取带有sum(爷爷.爸爸.孩子.钱\金额)和first(爷爷.爸爸.孩子.钱\单位)的爷爷对象。这是我的,但不起作用: class Grandpa { Long id; String name; Double moneyAmount; // sum of Children's money amount String moneyUnit; // first of Children's money unit.

塔尔贝斯:

类(此处省略注释):

我想写一个hql来获取带有sum(爷爷.爸爸.孩子.钱\金额)和first(爷爷.爸爸.孩子.钱\单位)的爷爷对象。这是我的,但不起作用:

class Grandpa
{
    Long id;
    String name;

    Double moneyAmount; // sum of Children's money amount

    String moneyUnit; // first of Children's money unit.
}

class Dad
{
    Long id;
    Grandpa grandpa;
}

class Children
{
    Long id;
    Dad dad;

    Double moneyAmount;
    String moneyUni;
}
并使用aliastobean transformer投影到dto中

或者将moneyAmount和unit实现为属性,这些属性访问包含DAD的子集合,并将内存中的金额相加

select gp.id, gp.name, sum(chdn.moneyAmount) as moneyAmount, min(chdn.moneyUnit) as gp.moneyUnit
from Children chdn, chdn.dad dad, dad.grandpa gp
groupBy gp.Id

但是要小心巨大的笛卡尔乘积

谢谢你的回答,我现在就在尝试。关于HQL的2个问题:1。父亲没有“孩子”。所以没有“爸爸,孩子”。2.如果有很多字段,我必须在HQL中列出所有字段吗?当我尝试时,第1行有一个例外,即作为gp.moneyAmount的“.”in“。有什么不对吗?因为可能有一些爷爷没有孩子(爸爸),或者爸爸可能没有孩子(孩子),我想我应该使用left-out-join,但我不知道如何用outer-join修改它。你能帮忙吗?非常感谢。当gp和dad没有儿童收藏时,您不能在hql中使用左外连接。你的选择:1。您可以发出第二个查询,获取第一个查询未返回的所有gp,并将金额和单位初始化为默认值2。介绍儿童收藏3。使用sql查询执行所需操作,并使用aliastobean将结果转换为对象
select gp, sum(chdn.moneyAmount) as gp.moneyAmount, first(chdn.moneyUnit) as gp.moneyUnit
from Grandpa gp, Dad dad, Children chdn
where gp.id =: chdn.dad.grandpa.id
select gp.id, gp.name, sum(chdn.moneyAmount) as moneyAmount, min(chdn.moneyUnit) as gp.moneyUnit
from Children chdn, chdn.dad dad, dad.grandpa gp
groupBy gp.Id
select gp from Grandpa gp join fetch gp.children dad join fetch dad.children