获取惰性一对多列表的子项

Tap*_*aka 5 groovy alias hibernate fetch hibernate-criteria

背景:使用 play 框架 (1.3)、hibernate (4.3.8) 和 html 方面的一些 Groovy 开发内部 Web 应用程序。

我目前正在使用 Hibernate,并被指派寻找一些优化技术。我们遇到了一些加载问题,因为所有内容都是延迟获取的,当我们尝试使用 Groovy 访问它时,Hibernate 会处理大量请求,这会花费大量时间,从而使我们的应用程序变得非常慢。

因此,我尝试调整我们的 find 方法来获取我需要的所有内容,这样 Hibernate 就不需要这样做了。

这是我的课:

    @实体
    @Table(名称=“business_partner”,模式=“公共”)
    公共类 BusinessPartner 扩展模型{
        @ID
        @Column(名称=“business_partner_id”,可更新= false,可空= false)
        @GenerateValue(策略=GenerationType.TABLE, 生成器=“businessPartnerGenerator”)
        @TableGenerator(名称=“businessPartnerGenerator”,
                表=“密钥生成器”,
                pkColumnName="表名",
                valueColumnName="next_id",
                分配大小=1)
        私有整数businessPartnerId;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(名称 = "航空公司_id")
        @独特的
        私人航空公司;

        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumn(名称 = "交易者国家/地区 ID")
        私人国家交易者国家;

        @Column(name = "name", nullable = false)
        @必需的
        @最大尺寸(50)
        @独特的
        私有字符串名称;

        @Column(名称=“代码”,可更新= false)
        @最大尺寸(5)
        @独特的
        私有字符串代码;

        @Column(name = "is_active", nullable = false)
        私有布尔值是否处于活动状态;

        @OneToMany(fetch = FetchType.LAZY,mappedBy =“businessPartner”,cascade = CascadeType.ALL)
        @Fetch(FetchMode.SUBSELECT)
        私有列表 lstBusinessPartnerTypes = new ArrayList();

        @OneToMany(fetch = FetchType.LAZY,mappedBy =“businessPartner”,cascade = CascadeType.ALL)
        @Fetch(FetchMode.SUBSELECT)
        私有列表 lstBusinessPartnerAddresses = new ArrayList();

这是我的标准:

公共静态列表findAll(){
        会话 oSession = SessionManager.createSession();

        列表 lstBusinessPartners = (List)oSession.createCriteria(BusinessPartner.class)
                .createAlias("lstBusinessPartnerAddresses", "lstBPA")
                .createAlias("lstBusinessPartnerTypes", "lstBPT")
                .setFetchMode("航空公司", FetchMode.JOIN)
                .setFetchMode("lstBPA.country", FetchMode.SELECT)
                .setFetchMode("lstBPT.typeBusinessPartner", FetchMode.SELECT)
                .addOrder(Order.asc("代码"))
                。列表();

        SessionManager.closeSession(oSession);

        返回 lstBusinessPartners;
    }

所以我需要访问航空公司和每个一对多列表的子项。

我可以访问航空公司,没有问题。当我尝试访问列表中的对象时,事情就变得棘手了。我无法加载列表及其子项(正如您从我的标准中看到的那样,我正在尝试访问一个列表中的国家/地区并在另一个列表中键入业务合作伙伴)。我对每个业务合作伙伴都收到这样的请求:

休眠示例

所以我的问题是:是否可以使用条件获取惰性列表?如果是这样怎么办?

Tap*_*aka 3

因此,如果有人偶然发现这篇文章寻找答案,我找到了我的答案。您需要为列表创建别名并指定 JoinType,如下所示:

BusinessPartner oBusinessPartner = (BusinessPartner)oSession.createCriteria(BusinessPartner.class, "BP")
            .add(Restrictions.eq("businessPartnerId", iBusinessPartnerId))
            .createAlias("lstBusinessPartnerTypes", "lstBPT", JoinType.LEFT_OUTER_JOIN)
            .createAlias("lstBPT.typeBusinessPartner", "TBP", JoinType.LEFT_OUTER_JOIN)
            .createAlias("lstBPT.accountGroup", "AG", JoinType.LEFT_OUTER_JOIN)
            .createAlias("AG.typeBusinessPartner", "AGTBP", JoinType.LEFT_OUTER_JOIN)
            .createAlias("lstBusinessPartnerAddresses", "lstBPA", JoinType.LEFT_OUTER_JOIN)
            .createAlias("lstBPA.country", "BPAC", JoinType.LEFT_OUTER_JOIN)
            .createAlias("lstBPA.language", "BPAL", JoinType.LEFT_OUTER_JOIN)       

            .uniqueResult();
Run Code Online (Sandbox Code Playgroud)