如果您非常简单地将表映射到 POJO(此处使用注释,但您可以使用 XML):
@Entity
@Table(name = "whatever")
public class Fields {
@Id
@Column(name = "ID")
private String id;
@Column(name = "FIELD1")
private String field1;
@Column(name = "FIELD2")
private String field2;
@Column(name = "DISCRIMINATOR")
private String discriminator;
@Column(name = "VALUE")
private String value;
}
您可以定义一个包含字段和值的单独 POJO:
public class FieldValues {
private String field1, field2, value1, value2;
public FieldValues( String field1, String field2, String value1, String value2 ) {
this.field1 = field1;
this.field2 = field2;
this.value1 = value1;
this.value2 = value2;
}
}
然后,您可以使用 JPQL 准确编写您概述的查询,在 中执行它EntityManager
,它仍然会参与所有 JPA 事务等等。
String sql = "SELECT a.field1, a.field2, a.value as value1, b.value as value2 "
+ " FROM Fields a, Fields b "
+ " WHERE a.FIELD1 = b.FIELD1 and a.FIELD2 = b.FIELD2 "
+ " AND a.DISCRIMINATOR = 'A' "
+ " AND b.DISCRIMINATOR = 'B'";
List<Object[]> result = entityManager.createQuery(sql, Object[].class);
List<FieldValues> result = new ArrayList<FieldValues>();
for (Object[] fieldSet : result) {
String field1 = (String) fieldSet[0];
String field2 = (String) fieldSet[1];
String value1 = (String) fieldSet[2];
String value2 = (String) fieldSet[3];
result.add(new FieldValues(field1, field2, value1, value2));
}
我相信您甚至可以让 HibernateFieldValues
为您映射,但我不记得如何。它可能就像FieldValues
用正确的列名注释(或 XML 映射)类一样简单,然后强制 HibernateList<FieldValues>
从查询中返回 a 而不是。这种方法的缺点是您无法对数据库进行更改FieldValue
并将其保存到数据库中。
另一种方法是使用普通的旧 SQL 和EntityManager.createNativeQuery
. 您必须确保在执行此操作之前刷新实体管理器;否则任何挂起的更改可能尚未写入数据库,因此您的查询不会看到。同样,我相信在这种情况下,您可以让 Hibernate 为您映射到FieldValues
该类。