Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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 如何基于NOT条件连接两个实体_Java_Sql_Hibernate_Orm_Hql - Fatal编程技术网

Java 如何基于NOT条件连接两个实体

Java 如何基于NOT条件连接两个实体,java,sql,hibernate,orm,hql,Java,Sql,Hibernate,Orm,Hql,我有两个表-例如,表A和表B,其中包含一些本文定义的数据- 现在我计划创建Hibernate实体,因为表和实体彼此不相关 现在我想得到的结果是基于我之前的文章中提到的非条件 结果是使用SQL查询: SELECT id, name, partNumber, Aid, Aname, Apart FROM TableB AS t CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart FROM Table

我有两个表-例如,表A和表B,其中包含一些本文定义的数据-

现在我计划创建Hibernate实体,因为表和实体彼此不相关

现在我想得到的结果是基于我之前的文章中提到的非条件

结果是使用SQL查询:

SELECT id, name, partNumber, Aid, Aname, Apart
FROM TableB AS t
CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart
            FROM TableA AS a
            WHERE NOT EXISTS (SELECT 1
                              FROM TableB AS b
                              WHERE b.partNumber = a.partNumber)) AS c
ORDER BY id   
现在,如何为此类场景创建HQL查询或条件查询。我已经阅读了HQL和Criteria查询的Hibernate文档,但无法理解如何将此SQL查询转换为HQL和Criteria查询。你能帮我一下吗

更新1:

Hibernate: 
    /* select
        a,
        b 
    from
        TableB b,
        TableA a 
    where
        b.partNumber != a.partNumber 
    ORDER BY
        b.id */ 

select
    tablea1_.id as id1_0_0_,
    tableb0_.id as id1_1_1_,
    tablea1_.name as name2_0_0_,
    tablea1_.partNumber as partNumber3_0_0_,
    tableb0_.name as name2_1_1_,
    tableb0_.partNumber as partNumber3_1_1_ 
from
    TableB tableb0_ cross 
join
    TableA tablea1_ 
where
    tableb0_.partNumber<>tablea1_.partNumber 
order by
    tableb0_.id
根据Vlad给出的答案,我没有得到正确的输出

以下是我编写的代码:

List<Object[]> list = session.createQuery(
                "select a, b " + "from TableB b, TableA a "
                        + "where b.partNumber != a.partNumber "
                        + "ORDER BY b.id").list();

        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }
从输出中,我得到了
TableA
的记录,id为
1,2,3,4
TableB
id为
5,6,7,8

但所需输出的id应为
TableA
as
3和4
,而
TableB
id应为
5,6,7,8
。详细情况见我的另一篇帖子:

由Hibernate生成的查询是:

Hibernate: 
    /* select
        a,
        b 
    from
        TableB b,
        TableA a 
    where
        b.partNumber != a.partNumber 
    ORDER BY
        b.id */ 

select
    tablea1_.id as id1_0_0_,
    tableb0_.id as id1_1_1_,
    tablea1_.name as name2_0_0_,
    tablea1_.partNumber as partNumber3_0_0_,
    tableb0_.name as name2_1_1_,
    tableb0_.partNumber as partNumber3_1_1_ 
from
    TableB tableb0_ cross 
join
    TableA tablea1_ 
where
    tableb0_.partNumber<>tablea1_.partNumber 
order by
    tableb0_.id
此查询的输出:

B: id=5, name=b1, partNumber=10
A: id=4, name=a4, partNumber=40
B: id=5, name=b1, partNumber=10
A: id=2, name=a2, partNumber=20
B: id=5, name=b1, partNumber=10
A: id=3, name=a3, partNumber=30
B: id=6, name=b2, partNumber=20
A: id=1, name=a1, partNumber=10
B: id=6, name=b2, partNumber=20
A: id=4, name=a4, partNumber=40
B: id=6, name=b2, partNumber=20
A: id=3, name=a3, partNumber=30
B: id=7, name=b3, partNumber=60
A: id=3, name=a3, partNumber=30
B: id=7, name=b3, partNumber=60
A: id=1, name=a1, partNumber=10
B: id=7, name=b3, partNumber=60
A: id=4, name=a4, partNumber=40
B: id=7, name=b3, partNumber=60
A: id=2, name=a2, partNumber=20
B: id=8, name=b4, partNumber=70
A: id=3, name=a3, partNumber=30
B: id=8, name=b4, partNumber=70
A: id=1, name=a1, partNumber=10
B: id=8, name=b4, partNumber=70
A: id=4, name=a4, partNumber=40
B: id=8, name=b4, partNumber=70
A: id=2, name=a2, partNumber=20

您需要使用θ样式的联接:

select b, a
from TableB b, TableA a 
where not exists (
    select 1
    from TableB b1, TableA a1
    where 
        b1.partNumber = a1.partNumber and
        b1.id = b.id and
        a1.id = a.id    
)   
order by b.id
或者,您也可以使用SQL查询获取实体:

List result = session.createSQLQuery("SELECT b.*, c.* \n" +
        "FROM TableB b AS t\n" +
        "CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart\n" +
        "            FROM TableA AS a\n" +
        "            WHERE NOT EXISTS (SELECT 1\n" +
        "                              FROM TableB AS b\n" +
        "                              WHERE b.partNumber = a.partNumber)) AS c\n" +
        "ORDER BY b.id ")
        .addEntity("b", B.class)
        .addEntity("a", A.class)
        .list();

感谢Vlad的回答,但解决方案没有按预期工作。我已经添加了更多关于我尝试过的内容和获得的输出的详细信息,请检查。此查询也没有给出预期的输出。我已在我的
更新2
会话中给出了详细信息。请尝试添加一个独特的。HQL不支持加入表表达式。您可以用两个查询来模拟本机查询结果。第一个从B中选择所有在A中没有等价物的行。另一个从A中选择所有在B中没有等价物的行。至于文档,你可以用Google Hibernate vs SQL。我指的是“交叉连接(选择..)为c”。
select b, a
from TableB b, TableA a 
where not exists (
    select 1
    from TableB b1, TableA a1
    where 
        b1.partNumber = a1.partNumber and
        b1.id = b.id and
        a1.id = a.id    
)   
order by b.id
List result = session.createSQLQuery("SELECT b.*, c.* \n" +
        "FROM TableB b AS t\n" +
        "CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart\n" +
        "            FROM TableA AS a\n" +
        "            WHERE NOT EXISTS (SELECT 1\n" +
        "                              FROM TableB AS b\n" +
        "                              WHERE b.partNumber = a.partNumber)) AS c\n" +
        "ORDER BY b.id ")
        .addEntity("b", B.class)
        .addEntity("a", A.class)
        .list();