hibernate - 获取一个懒惰的一对多列表的 child

标签 hibernate groovy alias fetch hibernate-criteria

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

我目前正在使用 Hibernate,我被分配寻找一些优化技术。我们有一些加载问题,因为所有内容都是延迟获取的,当我们尝试使用 Groovy 访问它时,Hibernate 将大量请求,这需要大量时间,使我们的应用程序非常慢。

所以我试图调整我们的 find 方法来获取我需要的所有东西,这样 Hibernate 就不必这样做了。

这是我的课:

@实体
@Table(name="business_partner", schema = "public")
公共(public)类 BusinessPartner 扩展模型{
@ID
@Column(name="business_partner_id", 可更新=false, nullable=false)
@GeneratedValue(strategy=GenerationType.TABLE, generator="businessPartnerGenerator")
@TableGenerator(name="businessPartnerGenerator",
表="key_generator",
pkColumnName="table_name",
valueColumnName="next_id",
分配大小=1)
私有(private)整数业务合作伙伴ID;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "airline_id")
@独特
私有(private)航空公司;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "trader_country_id")
私有(private)国家贸易商国家;

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

@Column(名称=“代码”,可更新=假)
@MaxSize(5)
@独特
私有(private)字符串代码;

@Column(name = "is_active", nullable = false)
私有(private) bool isActive;

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

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

这是我的标准:

公共(public)静态列表 findAll(){
session 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("code"))
。列表();

SessionManager.closeSession(oSession);

返回 lstBusinessPartners;
}

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

我可以访问航空公司,那里没有问题。当我尝试访问列表中的对象时,它变得很棘手。我无法加载列表或他们的 child (从我的标准中可以看出,我试图在一个列表中访问国家/地区并在另一个列表中键入业务伙伴)。我对每个商业伙伴都有这样的要求:

Hibernate example

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

最佳答案

因此,如果有人偶然发现这篇文章寻找答案,我找到了我的答案。您需要为您的列表创建一个别名并指定 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();

关于hibernate - 获取一个懒惰的一对多列表的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40104041/

相关文章:

join - Sequelize 查询 - 是否可以在包含的(内连接)模型中为字段设置别名

java - 带有 Hibernate 4.2 错误 : setCharacterStream(ILjava/io/Reader;J)V is abstract 的 C3p0

groovy - 使用soapUI中的Groovy teststep将请求/响应文件存储在本地目录中

validation - 在Grails域对象中,是否可以基于另一个字段来验证一个字段?

别名上的 ElasticSearch 不起作用

linux bashrc 别名以打开终端并运行各个脚本

spring - 使用Java JPA和Spring Data在MYSQL数据库中存储结构化注释

java - 将使用 ManyToMany 关系的 SQL 查询转换为 JPQL 查询

hibernate - Grails和JPA集成

bash - 从 groovy 打印 $PATH - 字符被转义?