2015-03-31 60 views
0

我有以下实体:如何检索一个实体,该实体是另一个实体的属性,可能的开销较少?

@Entity 
public class A{ 
     ... 
     @ManyToOne(optional=false, fetch=FetchType.LAZY) 
     @NotFound(action=NotFoundAction.EXCEPTION) 
     @JoinColumn(name="ID_CLASSB", nullable=false, insertable=true, updatable=true) 
     private B b; 
     ... 
     private String anIdentifier; 
     ... 
     @OneToMany(fetch=FetchType.LAZY)... 
     private List<C> manyObjects; 
     ... 
     @OneToMany(fetch=FetchType.LAZY)... 
     private List<D> soMany; 
} 

正如你可以看到实体B是实体A.属性

乙实体没有参照实体,由简单的属性进行:

@Entity 
public class B{ 

    @Column(...) 
    private String field1; 

    @Column(...) 
    private int field2; 
    ... 
} 

现在,我想从“anIdentifier”属性与特定值相匹配的A实体中检索所有B实体。 我的查询,就目前而言,将是:

"select a.b from A a where a.anIdentifier='identifier'" 

问题是,这第二个查询是特别慢......我想这是因为休眠还是创建之前整个实体A(因而其所有属性)提取实体B.

那么,是否有另一种最有效的方式来实现我的目标?

+0

“B”是否有对“A”的反向引用?我不希望这个查询初始化所有的''',但你可以记录生成的SQL语句来检查。 – 2015-03-31 08:53:56

+0

和SQL是?除非您提供它现在所做的参考信息,并且显示所调用的SQL是唯一方法,否则您无法询问开销 – 2015-03-31 09:58:31

回答

1

这是一个简单的查询,它应该工作得很快。提取A的事实不会影响它,因为关系会被延迟加载(但A可能没有被提取)

它缓慢的典型原因是: - A到B的外键没有索引关系(表A的ID_CLASSB), - 你有很多As在DB中,并且没有索引在标识符上

因此,首先检查它们在DB中的存在。

通常,您需要能够看到生成的sql能够推理(并测试)性能。 你可以检查这个答案如何完成休眠How to print a query string with parameter values when using Hibernate

一旦你有真正的查询,你在数据库中测试,例如在MySQL中它是解释命令。

相关问题