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

2023-12-24

如何仅针对给定的 NamedQuery 实施延迟加载策略。

例如。考虑下面的伪代码(只是为了解释这种情况) 我有一个实体

@Entity
class Xyz {
 int a;
 int b;

@Fetch = EAGER
 Set<ABC> listOfItems;
}

在本例中,我们已声明要急切获取 listOfItems。

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

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

预先感谢您的建议


如果你不想获取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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA - 仅针对给定查询强制延迟加载 的相关文章

随机推荐