如何将返回的对象转换为必需的bean / pojo

时间:2017-01-28 06:53:40

标签: java json spring hibernate jpa

我的要求是说我有两张桌子:

  

T1:id,name,email

     

T2:id,地址

要从两个表格中获取数据,我的结果如下:

Collection  ls=null;
EntityManager em=ConnectionUtils.getEntityManager();
tx= em.getTransaction();
tx.begin();
Query q=em.createQuery("select t1.name,t2.address from T1 t1, T2 t2");
ls=(List<T1T2>)q.getResultList();
  

OP:[[Ljava.lang.Object; @ e836bd1,[Ljava.lang.Object; @ 561b6dc8,   [Ljava.lang.Object; @ 22c491a2,[Ljava.lang.Object; @ 17353483,   [Ljava.lang.Object; @ 260a905c,[Ljava.lang.Object; @ 7f8b9b86,   [Ljava.lang.Object; @ 268fbbd5,[Ljava.lang.Object; @ 2674b0ba,   [Ljava.lang.Object; @ 36fe970f,[Ljava.lang.Object; @ 46f75fe,   [Ljava.lang.Object; @ 31ab78f8,[Ljava.lang.Object; @ 7092fb41,   [Ljava.lang.Object; @ 41ada224,[Ljava.lang.Object; @ 6e700b2b]

是的,它令人讨厌。 我正在获取数据,但它是一个普通的对象。

我创建了pojo:

  

T1T2:字符串名称;字符串地址;获取返回的对象   格式。但获得正确的格式而不是实体错误和pojo   不是错误。

我想要将相同类型的概念作为json字符串编组到相应的pojo。

3 个答案:

答案 0 :(得分:2)

如果您想使用JPA映射到POJO,请使用@SqlResultSetMapping注释

假设T1T2有一个构造函数T1T2(String name, String address)将此添加到您的任何实体类定义中

@SqlResultSetMapping(name = "CUSTOM_MAPPING", classes = @ConstructorResult(
targetClass = T1T2.class,
columns = {@ColumnResult(name = "name", type = String.class),
 @ColumnResult(name = "address", type = String.class)}))

现在您可以使用此映射:

Query q=em.createNativeQuery("select t1.name,t2.address from T1 t1, T2 t2","CUSTOM_MAPPING");
List<T1T2> = q.getResultList();

请注意,它仅适用于本机查询。我假设在T1和T2之间没有在JPA实体级别定义关联,否则整个过程已经过时。如果存在关联,请使用@JoinTable注释来声明它,JPA将确保与实体一起获取关联。

答案 1 :(得分:0)

如果您不需要完整的ORM功能(或者不知道如何正确执行),您可以使用Spring JdbcTemplate完成任务:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
List<T1T2> pojos = jdbcTemplate.query(
    "SELECT t1.name, t2.address FROM T1 t1 JOIN T2 t2 ON t1.id=t2.id",
    new BeanPropertyRowMapper(T1T2.class));

BeanPropertyRowMapper将结果集列映射到具有相同名称的POJO字段,尊重字段类型。

答案 2 :(得分:0)

将JPQL查询结果映射到POJO

执行查询时

Query q=em.createQuery("select t1.name,t2.address from T1 t1, T2 t2");
Collection c = q.getResultList();

您将获得零个或多个Object类型数组实例的集合。如果您希望将查询结果映射到POJO,则可以使用所谓的Construcot Expression。要使用它,首先使用适当的构造函数如下定义POJO:

package com.myproject.dto;

public class T1T2 {
    private String name;
    private String address;

    public T1T2() {}

    public T1T2(String name, String address) {
        this.name = name;
        this.address = address;
    }

    // getters + setters
}

然后您可以按如下方式制定查询:

String queryString = "SELECT NEW com.myproject.dto.T1T2(t1.name, t2.address) FROM T1 t1, T2 t2";
TypedQuery<T1T2> q = em.createQuery(queryString, T1T2.class);
Collection<T1T2> result = q.getResultList();

现在你应该有一个零个或多个POJO实例的集合,你不需要施放。

如果您想了解详细信息,请参阅JPA 2.0 Spec的摘录:

  

4.8.2 SELECT子句中的构造函数表达式

     

可以在SELECT列表中使用构造函数来返回Java类的实例。指定的类不需要是实体或映射到数据库。构造函数名称必须是完全限定的。

     

如果在SELECT NEW子句中将实体类名指定为构造函数名称,则生成的实体实例将处于新状态。

     

如果作为构造函数参数的single_valued_pa​​th_expression或identification_variable引用实体,则该single_valued_pa​​th_expression或identification_variable引用的结果实体实例将处于托管状态。

注意:您的查询正在构建x产品,您真的想要吗?截至目前,您将获得任何地址的任何名称。