【问题标题】:Get many object from result of Oracle view从 Oracle 视图的结果中获取多个对象
【发布时间】:2018-04-06 20:02:14
【问题描述】:

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

  • 标签A与列ida1a2a3
  • 标签B 与列idb1b2b3

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

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 应用程序中,我想通过 Hibernate 的 Foo 查看信息结果。所以我必须使用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_d,这是D表的外键

【问题讨论】:

    标签: java oracle hibernate nativequery hibernate-native-query


    【解决方案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”创建一个实体类,并编写条件查询来获取结果。

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

    DB View to Hibernate Entity Mapping

    How to map a view with 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
    }
    

    【讨论】:

    • 如果像在版本中一样,在表AB 我有另一个实体的外键,我会按照你的建议创建新的域类Foo?在创建自定义对象AB 时,我必须对数据库进行另一个查询以获取ID 等于fk_cC 对象并获取ID 等于DD 对象fk_d
    • 我已经更新了帖子,请检查。在这种情况下,您可以考虑将您的视图映射到实体类。
    • 我会尝试,但我必须添加@Immutable 注释以忽略此实体上的所有更改。
    • 它不适用于 @OneToMany@JoinColumn - 我得到空的对象列表 CD 类:(
    猜你喜欢
    • 2017-03-15
    • 2016-12-14
    • 1970-01-01
    • 2020-06-06
    • 2013-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2019-04-07
    相关资源
    最近更新 更多