当前位置: 首页 > 面试题库 >

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

闻人高卓
2023-03-14
问题内容

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

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


问题答案:

您可以轻松编写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();

这应该适合您的情况。



 类似资料:
  • 问题内容: 我使用Hibernate Envers审核我的实体。 我有一个审核的实体,它具有as属性。但是,我不想审核实体。因此,我写道: 现在,我要检索的修订: 不幸的是,当我想检索所有数据时(即,当它延迟加载时),我得到了error ,因为它试图查询: 我虽然使用,但Hibernate Envers会保持与 当前 实体项目的链接。 __ 那么如何解决我的问题,而不必显式审核表和(联接表)?在别

  • 问题内容: 有什么办法可以使两个表之间没有直接关系但又在hibernate中有两个公共字段呢? 我有两个表,称为boiler_plates和profile,它们之间没有直接关系,但是有一个名为contract_id的公共字段。 我写了查询“来自bp.bt_contracts = p.contract_id上的Boiler_Plates bp内部连接配置文件p”,但它不断抛出错误。“意外令牌:在第1

  • 我使用Hibernate恩维尔斯来审核我的实体。 我有一个被审计的实体,,它有一个 ,我得到错误< code>ORA-00942:表或视图不存在,因为它试图查询: 我认为,使用,Hibernate Envers将保留与当前实体的item的链接。 那么,我该如何解决我的问题,而不必显式地审计表< code>T_BAR和< code>T_FOO_BAR(连接表)?换句话说,当我从我的修订实体中检索<

  • 问题内容: 我有两个表和相关的Java映射。 这是我的Java实体。国家POJO: 和用户POJO: 问题是,我怎么能加入到在Hibernate中使用注释?当我使用Hibernate创建User对象时,我需要自动绑定这两个字段(代码和countryCode)。 问题答案: 您需要从映射到实体,并从映射到:

  • 我有两个不相关的表,每一个都有字段email。我需要一个查询,它引入从第二个表的列,如果电子邮件匹配或将是空的,如果没有找到匹配。在SQL中,这很容易: 现在,它作为JPA查询工作,但我们使用的是查询DSL,因此我们开始转换它: 它工作,但现在我不知道如何实现排序和筛选的字段引入子查询。 是用于收集结果的POJO;是从自动生成的类。 问题是:如何使用查询DSL和JPA并避免本机SQL连接两个不相关

  • 我有两个词A,B。在这个词中A是父词,有下面的表结构。 A1-->Acolumn 甚至我也尝试过使用普通连接。PLS让我知道我错过了什么。 我使用@query来指定query。选择a From TableA a LEFT OUTER JOIN FETCH a.tableAcollection p,其中a.tableacolum=?1和p.tablebcolumn<>p.tablebcolumn。