JPA-在非实体类中连接两个表 [英] JPA- Joining two tables in non-entity class

查看:489
本文介绍了JPA-在非实体类中连接两个表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是新手,试图谷歌但我无法解决我的疑问。
请帮助。

I am a newbie ,tried to google but I am unable to solve my query. Please help.

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

I am trying to map two entities : PersonA and Person in my POJO class PersonC

@Entity
class PersonA{
     String sample_field;
}

@Entity
class Person{
     String id;
     String name;

}

以上两个是jpa的实体。

Above two are entities of jpa.

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

Now I want to merge them into one pojo class.

class PersonC
{
   Strind id;
   String address;
}

尝试下面的代码但是当我尝试获取地址/外键字段时它会不工作。

Tried below code but when I try to fetch Address/Foreign key field it does not work.

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

我应该在哪里定义@SqlResultSetMapping,从上面的哪个类?

})

where should I define @SqlResultSetMapping ,for which class from the above? ) })

推荐答案

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

@SqlResultSetMapping can be placed at any entity class (don't annotate POJOs - it won't work). Mapping to POJO class with @ConstructorResult was added in version 2.1 of JPA. POJO used with the mapping has to have correct constructor.


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

All columns corresponding to arguments of the intended constructor must be specified using the columns element of the ConstructorResult annotation in the same order as that of the argument list of the constructor.

请参考以下有关查询用法的示例,并相应地计算出您的情况。

Please consult following example with query usage and work out your case accordingly.

@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名称 AS street )必须匹配 @ColumnResult 中的名称。
该示例针对Ecliselink 2.5.1进行了测试。

Please note that aliases (AS name and AS street) has to match the names in @ColumnResults. The example was tested against Ecliselink 2.5.1.

这篇关于JPA-在非实体类中连接两个表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆