0

为了使我的java代码更容易,我想将两行合并为一,因为我真的需要这两行才能使用数据。

假设这些是我表的字段:

ID, FIELD1, FIELD2, DISCRIMINATOR, VALUE

显然,ID 是主键。FIELD1 和 2 让我们识别 2 行的“组”,它们仅通过 DISCRIMINATOR 和 VALUE 不同(鉴别器指示值代表什么)

我希望每个“组”有一个 POJO(其中 FIELD1 和 2 将用作复合 ID),例如:

FIELD1, FIELD2, VALUE1, VALUE2

在哪里 :

VALUE1 = 鉴别器 A 的 VALUE

VALUE2 = 鉴别器 B 的 VALUE

在 SQL 中,我会这样请求它:

SELECT a.FIELD1, a.FIELD2, a.VALUE as VALUE1, b.VALUE as VALUE2
FROM TABLE a, TABLE b
WHERE a.FIELD1 = b.FIELD1 and a.FIELD2 = b.FIELD2
  AND a.DISCRIMINATOR = 'A'
  AND b.DISCRIMINATOR = 'B'

不幸的是,我不知道如何让它在休眠状态下,我现在对所有的可能性感到困惑。

我宁愿将解决方案作为映射的 XML,但如果别无选择,仍然会采用注释解决方案。

4

1 回答 1

0

如果您非常简单地将表映射到 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该类。

于 2013-03-01T15:58:51.587 回答