I have 2 tables - TableA and TableB for example with some data in them as defined in this post - How to join results of 2 tables based on not condition
Now I am planning to create Hibernate entities for both the tables and the entities are not related to each other.
Now I want to get the results based on NOT condition as given in my earlier post which I have mentioned.
The result is to use the SQL query:
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
Now how to create HQL query or criteria queries for such scenario's. I have gone through the Hibernate documentation for HQL & Criteria queries but I was not able to understand how can I convert this SQL query to HQL and Criteria queries. Can you please help me on this.
Update 1:
Based on the answer given by Vlad I am not getting correct output.
Here is the Code I have written:
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);
}
}
I got below output:
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
From output I got records of TableA
with id's = 1,2,3,4
& for TableB
id's= 5,6,7,8
.
But the desired output should have id's of TableA
as 3&4
and for TableB
id's as 5,6,7,8
. The details are given in my other post : How to join results of 2 tables based on not condition
Query generated by Hibernate is:
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
Update 2:
Code that I have tried now:
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);
}
}
Query generated by 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
Output of this query:
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
You need to use a theta-style join:
or you can use an SQL query to fetch entities as well: