一尘不染

如何使用JPA和Hibernate联接两个不相关的实体

hibernate

我有两个表-
一个包含地址,另一个包含照片。它们之间唯一的共同字段是PersonID。这些被映射到两个POJO类Address和Photo。我可以通过创建条件并在字段中添加限制来获取这些表中的详细信息。我们应该如何在两个表上编写联接。是否有可能将结果作为两个对象获得-
地址和照片。

我想做一个左联接,这样我也可以得到没有照片的人的记录。我读过,只有使用hql才有可能,但是也可以使用条件来做到这一点吗?


阅读 265

收藏
2020-06-20

共1个答案

一尘不染

您可以轻松编写HQL查询,使用Theta Join(如Adrian所述)将结果作为两个对象返回。这是一个例子:

String queryText = "select address, photo from Address address, Photo photo " 
                 + " where address.personID=photo.personId";
List<Object[]> rows = session.createQuery(queryText).list();

for (Object[] row: rows) {
    System.out.println(" ------- ");
    System.out.println("Address object: " + row[0]);
    System.out.println("Photo object: " + row[1]);
}

如您所见,查询返回Object []数组的列表,这些数组代表每个提取的行。此数组的第一个元素将包含一个对象,第二个元素-另一个。

编辑:

在左连接的情况下,我认为您需要使用本机SQL查询(而不是HQL查询)。您可以在这里执行以下操作:

String queryText = "select address.*, photo.* from ADDRESS address 
                    left join PHOTO photo on (address.person_id=photo.person_id)";

List<Object[]> rows = sess.createSQLQuery(queryText)
                          .addEntity("address", Address.class)
                          .addEntity("photo", Photo.class)
                          .list();

这应该适合您的情况。

2020-06-20