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

JPA-在非实体类中联接两个表

洪和平
2023-03-14
问题内容

我是新手,尝试过使用google,但无法解决我的查询。请帮忙。

我正在尝试在POJO类PersonC中映射两个实体:PersonA和Person

@Entity
class PersonA{
     String sample_field;
}

@Entity
class Person{
     String id;
     String name;

}

以上两个是jpa的实体。

现在,我想将它们合并为一个pojo类。

class PersonC
{
   Strind id;
   String address;
}

尝试下面的代码,但是当我尝试获取“地址/外键”字段时,它不起作用。

@SqlResultSetMapping(name="PersonC", 
classes = {
   @ConstructorResult(targetClass = PersonC.class, 
    columns = {@ColumnResult(name="name")
              , @ColumnResult(name="address")
    )}

我应该在哪里为上面的哪个类定义@SqlResultSetMapping?)})


问题答案:

@SqlResultSetMapping可以放在 任何 实体类中(不要为POJO注释-
它不起作用)。@ConstructorResult在JPA 2.1版中添加了映射到POJO类。与映射一起使用的POJO必须具有正确的构造函数。

必须使用ConstructorResult批注中的columns元素以与构造函数的参数列表相同的顺序指定与预期构造函数的参数对应的所有列。

请参考以下查询用法示例,并据此解决您的问题。

@Entity
public class Address {
    @Id int id;  
    String street;
}


@SqlResultSetMapping(name="PersonDTOMapping",
    classes = {
     @ConstructorResult(targetClass = PersonDTO.class,
       columns = {@ColumnResult(name="name"), @ColumnResult(name="street")}
     )}
)
@Entity
public class Person {
    @Id int id;
    String name;
    Address address;  
}

public class PersonDTO {
    String name;
    String street;
    public PersonDTO(String name, String street) {
        this.name = name;
        this.street = street;
    }
}

// usage
Query query = em.createNativeQuery(
    "SELECT p.name AS name, a.street AS street FROM Person p, Address a WHERE p.address_id=a.id",
    "PersonDTOMapping");
List<PersonDTO> result = query.getResultList();

请注意,别名(AS nameAS street)必须与@ColumnResults 中的名称匹配。该示例已针对Ecliselink
2.5.1进行了测试。



 类似资料:
  • 问题内容: 我想写一个查询。我是Spring Data JPA的新手。我不知道如何为Join查询编写实体。这是一个尝试: 另一个实体是: 我想写一个crudRepository诸如 问题答案: 有关员工拥有一个或多个电话的典型示例,请参阅此Wikibook部分。 对于你的特定示例,如果你想建立关系,则应更改ReleaseDateType模型中的下一个代码: 对于: 在CacheMedia模型中,你

  • 另一个实体是: 我想编写一个接口,例如

  • 我正在努力使用jpa Crudepository接口连接两个实体模型。我不知道如何映射两个实体模型并在@query注释中编写查询。这些是我的实体类。我想执行这个查询“从taxi\u driver\u映射中选择dppd.payment\u plan\u id,dppd.attribute\u value,dppd.attribute\u id作为tdm加入driver\u payment\u pla

  • 我有两个词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。

  • 问题内容: 我有两个表- 一个包含地址,另一个包含照片。它们之间唯一的共同字段是PersonID。这些被映射到两个POJO类Address和Photo。我可以通过创建条件并在字段中添加限制来获取这些表中的详细信息。我们应该如何在两个表上编写联接。是否有可能将结果作为两个对象获得- 地址和照片。 我想做一个左联接,这样我也可以得到没有照片的人的记录。我读过,只有使用hql才有可能,但是也可以使用条件