我的要求是说我有两张桌子:
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。
答案 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)
执行查询时
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_path_expression或identification_variable引用实体,则该single_valued_path_expression或identification_variable引用的结果实体实例将处于托管状态。
注意:您的查询正在构建x产品,您真的想要吗?截至目前,您将获得任何地址的任何名称。