6

我如何为给定的 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。

我可以通过哪些方式实现它们?ps:1.我不想在实体类中将 listOfItems 更改为 Lazy 2.我不想在查询中选择特定字段,例如name="select a,b from Xyz z where a = ? "

提前感谢您的建议

4

2 回答 2

1

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

引用规范:

公共枚举 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);
于 2012-06-09T13:23:27.157 回答
0

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

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

于 2012-06-11T13:55:50.477 回答