2

在我的 Oracle 数据库中,我有两个示例表:

  • 带有A列的表格id, a1, a2,a3
  • 带有B列的表格id, b1, b2,b3

我有从这两个表中获取信息的视图:

CREATE VIEW Foo ("A.id", "A.a1", "A.a2", "A.a3", "B.id", "B.b1", "B.b2", "B.b3") AS
SELECT aaa.*, bbb.*
FROM A aaa, B bbb
WHERE 
   ...some conditions...;

在我的 Java 应用程序中,我想Foo通过 Hibernate 的视图获取信息结果。所以我必须使用createSQLQuery()方法:

public List<SomeObject> findSomeObjects() {
    Query q = sessionFactory.getCurrentSession()
             .createSQLQuery("select f.* from Foo f")
             .addEntity(A.class).addEntity(B.class);
    List l = q.list();

    //here I want to get object of A class and B class from return l
    //and prepare return list of SomeObject
}

SomeObject是 A 类和 B 类的总和。

我从返回列表和构造列表中获取 A 类和 B 类的对象有问题SomeObject。我怎样才能正确地做到这一点?

编辑

  • A还有一列,这是表fk_c的外键C
  • B还有一列,这是表的外fk_dD
4

1 回答 1

1

创建一个域类,其中包含视图“Foo”中存在的所有字段,如下所示。

Class Foo {

    private String a_id;
    private String a1;
    private String a2;
    private String a3;
    private String b_id;
    private String b1;
    private String b2;
    private String b3;

    // Getters
    // Setters
}

修改您的 SQL 查询如下:

public List<SomeObject> findSomeObjects() {
    Query q = sessionFactory.getCurrentSession()
             .createSQLQuery("select f.* from Foo f")
             .setResultTransformer(Transformers.aliasToBean(Foo.class))
    List l = q.list();

    // here you can iterate through the list to fetch the fields and 
    // create a own custom object as per your requirement.

}

替代解决方案:

您还可以为视图“Foo”创建一个实体类,并编写条件查询来获取结果。

请检查以下链接是否相同:

数据库视图到 Hibernate 实体映射

如何使用 Hibernate 映射视图

编辑:

如果您的视图中有其他表(C,D)的外键,我建议您通过将关系添加到其他依赖实体(C,D)来将此视图映射为休眠实体类。

@Entity
@Immutable
Class Foo {

    private String a_id;
    private String a1;
    private String a2;
    private String a3;
    private String b_id;
    private String b1;
    private String b2;
    private String b3;

    @OneToMany
    @JoinColumn(name = "C_id")
    private List<C> c;

    @OneToMany
    @JoinColumn(name = "d_id")
    private List<D> d;

    // Getters
    // Setters
}
于 2017-10-26T04:19:34.590 回答