JPA - 仅为给定查询强制延迟加载

时间:2012-06-09 10:51:03

标签: jpa

如何为给定的NamedQuery强制执行延迟加载策略。

例如。考虑下面的伪代码(仅用于解释案例) 我有一个实体

@Entity
class Xyz {
 int a;
 int b;

@Fetch = EAGER
 Set<ABC> listOfItems;
}

在这种情况下,我们声明listOfItems被EAGERLY获取。

现在假设我有一个NamedQuery (query="getXyz" , name="select x from Xyz x where a=?") 对于这个查询,我只需要结果是懒惰的,即我不想要检索listOfItems。

我可以通过什么方式实现这些目标? p.s:  1.我不想在实体类中将listOfItems更改为Lazy  2.我不想在查询中选择特定字段,如name="select a,b from Xyz z where a = ? "

提前感谢您的建议

2 个答案:

答案 0 :(得分:1)

如果您不想急切地获取Set,则必须将其定义为懒惰。但是请注意,当您指定延迟时,允许执行时急切地获取。

引用规范:

  

public enum FetchType   扩展java.lang.Enum

     

定义从数据库中获取数据的策略。 EAGER策略是持久性提供程序运行时的一项要求,必须急切地获取数据。 LAZY策略是持久性提供程序运行时的提示,即数据在首次访问时应该被懒惰地获取。允许实现急切地获取已指定LAZY策略提示的数据。

如果你不想取这样的Set我会作为另一种选择创建一个小班来满足你的需求:

@Entity
@Table(name = "XYZ")
public class XyzStub
{
    int a;
    int b;
}

您可以使用TypedQuery查询:

EntityManager em;
//....
TypedQuery<XyzStub> q = em.createNamedQuery("select x from XyzStub x where x.a = :a", XyzStub.class)
q.setParameter("a", a);

答案 1 :(得分:0)

如果您使用的是EclipseLink,则可以使用获取组

http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup