java - 如何根据 NOT 条件加入 2 个实体

标签 java sql hibernate orm hql

我有 2 个表 - 例如 TableA 和 TableB,其中包含本文中定义的一些数据 - How to join results of 2 tables based on not condition

现在我计划为两个表创建 Hibernate 实体,并且这些实体彼此不相关。

现在我想根据我之前提到的帖子中给出的 NOT 条件获得结果。

结果是使用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:

根据 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);
            }
        }

我得到以下输出:

A: id=2, name=a2, partNumber=20
B: id=5, name=b1, partNumber=10

A: id=3, name=a3, partNumber=30
B: id=5, name=b1, partNumber=10

A: id=4, name=a4, partNumber=40
B: id=5, name=b1, partNumber=10

A: id=1, name=a1, partNumber=10
B: id=6, name=b2, partNumber=20

A: id=3, name=a3, partNumber=30
B: id=6, name=b2, partNumber=20

A: id=4, name=a4, partNumber=40
B: id=6, name=b2, partNumber=20

A: id=1, name=a1, partNumber=10
B: id=7, name=b3, partNumber=60

A: id=2, name=a2, partNumber=20
B: id=7, name=b3, partNumber=60

A: id=3, name=a3, partNumber=30
B: id=7, name=b3, partNumber=60

A: id=4, name=a4, partNumber=40
B: id=7, name=b3, partNumber=60

A: id=1, name=a1, partNumber=10
B: id=8, name=b4, partNumber=70

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=4, name=a4, partNumber=40
B: id=8, name=b4, partNumber=70

从输出中,我得到了 TableA 的记录,id 为 1,2,3,4TableBid 为 5 ,6,7,8

但所需的输出应该有 TableA 的 id 为 3&4TableB 的 id 为 5,6,7,8 。详细信息在我的另一篇文章中给出:How to join results of 2 tables based on not condition

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

更新 2:

我现在试过的代码:

List<Object[]> list = session.createQuery("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();
        for (Object[] objects : list) {
            for (Object object : objects) {
                System.out.println(object);
            }
        }

Hibernate 生成的查询:

Hibernate: 

select
            tableb0_.id as id1_1_0_,
            tablea1_.id as id1_0_1_,
            tableb0_.name as name2_1_0_,
            tableb0_.partNumber as partNumb3_1_0_,
            tablea1_.name as name2_0_1_,
            tablea1_.partNumber as partNumb3_0_1_ 
        from
            TableB tableb0_ cross 
        join
            TableA tablea1_ 
        where
            not (exists (select
                1 
            from
                TableB tableb2_ cross 
            join
                TableA tablea3_ 
            where
                tableb2_.partNumber=tablea3_.partNumber 
                and tableb2_.id=tableb0_.id 
                and tablea3_.id=tablea1_.id)) 
        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

最佳答案

您需要使用 theta 样式的连接:

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();

关于java - 如何根据 NOT 条件加入 2 个实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894928/

相关文章:

java - 如何在验证失败时保持打开表单的弹出窗口并在成功保存时关闭它?

java - 如何使用 Gradle java 插件将 "illegal-access=deny"传递给单元测试的 JVM 参数?

java - 什么是 NullPointerException,我该如何解决?

php - LIKE SQL 参数抛出无效参数号

java - Spring 和 Hibernate - 在 hibernate.cfg.xml 中无需硬编码密码即可使用

java - 从实体中获取外键引用变量在jpa中返回空列表

java - 无法将悬停属性添加到自定义 HTML 邮件

sql - 这个 T-SQL 语句有什么问题?

sql - 调用存储过程本身sql

java - hibernate : How override an attribute from mapped super class