如何使用@NaturalId检索实体ID而不加载Hibernate中的整个对象

9gm1akwq  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(108)

在我的Sping Boot 项目中,我有几个同时用@Id和@NaturalId注解标记的实体。我已经创建了一个自定义的NaturalIdRepository,如this one。下面是我的仓库中的一个方法:

@Override
public T findBySimpleNaturalId(Class<T> clazz, Object naturalId) {
    return entityManager
        .unwrap(Session.class)
        .bySimpleNaturalId(clazz)
        .load(naturalId);
}

为了优化性能,我希望在存储库中添加一个新方法,该方法可以使用naturalId仅检索ID,而无需将整个对象加载到会话中。您能否就如何实现这一目标提供一些指导或建议?
谢谢

uemypmqf

uemypmqf1#

不要认为Session上有任何内置方法可以开箱即用。最好的办法是为此编写一个JPQL。Something like:

public Integer findIdByNaturalId(MyNaturalId id){
   return entityManager.createQuery("select foo.id from Foo foo where foo.field1 = :field1 and foo.field2 = :field2",Integer.class)
                .setParameter("field1" , id.getField1())
                .setParameter("field2" , id.getField2())
                .getSingleResult();
}

相关问题