如何基于NOT条件加入2个实体

我有2个表 – 例如TableA和TableB,其中包含一些数据,如本文所定义 – 如何基于非条件连接2个表的结果

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

现在我想根据我之前提到的post中给出的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查询或条件查询 。 我已经浏览了Hibernate文档中的HQL和Criteria查询,但我无法理解如何将此SQL查询转换为HQL和Criteria查询。 你能帮我解决这个问题。

更新1:

根据弗拉德给出的答案我没有得到正确的输出。

这是我写的代码:

 List 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,4TableB id = 5,6,7,8

但是所需的输出应该具有TableA id为3&4 ,而TableB id为5,6,7,8 。 详细信息在我的另一篇文章中给出: 如何根据非条件加入2个表的结果

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_.partNumbertablea1_.partNumber order by tableb0_.id 

更新2:

我现在尝试的代码:

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