【问题标题】:Retrieve List of "hibernate proxy objects" with "Spring Data Jpa query"使用“Spring Data Jpa 查询”检索“休眠代理对象”列表
【发布时间】:2019-07-23 23:02:28
【问题描述】:

我可以通过 Spring Data Jpa 查询以某种方式检索 Hibernate 代理对象 列表吗?

我有来自请求的对象 ID,我不想检索它们(因为实体中有许多 OneToOne 关系),但我想检索将包含其 ID 的代理(我需要这个来建立关系)。我想要 Hibernate findOne()getOne() 之类的东西,但要获得列表结果。

任何建议将不胜感激,谢谢!

【问题讨论】:

  • 嗯,我不明白这个问题。你基本上不想要一个完整的对象?
  • getOne() 在做什么?它在不完全加载它的情况下获取代理对象吗?所以我想要相同的,但列表。像 findAll(QUser.user.userType.eq(“manager”)) 和 querydsl 一样。
  • @LppEdd 我希望 findAll 结果是代理对象列表。
  • 重新开始。你的要求不清楚。在我看来,您要么想要返回 either (a) 仅返回一个 ID 列表,或者 (b) 一个对象列表,但没有设置它们的关联。根据您的要求,有不同的可能解决方案,请阅读以下内容:meta.stackexchange.com/questions/66377/what-is-the-xy-problem,然后阐明您想要做什么。
  • 您是否尝试过我在回答中提出的解决方案?

标签: java hibernate spring-data-jpa querydsl


【解决方案1】:

如果我回答你的问题,你想做这样的事情:

地理空间存储库查询(不需要@Query 注解)

public interface PersonRepository extends JpaRepository<Person, String>
List<Person> findByLocationNear(String location, Integer distance);
List<Person> findByCity(String city);
}

但是,您也可以在存储库中使用 JQL 查询方法

@Query("SELECT p FROM Person t WHERE p.name =?1 AND p.location=?2 ") 
List<Person> findPersonByLocation(String fName, String location);

另外,您可以使用HQL

【讨论】:

  • 我认为它会完全加载列表对象而不是代理,对吗?
【解决方案2】:

正确的解决方案是使用EntityManager 实例。

entityManager.getReference(YourClass.class, id);

由于此方法仅接受单个 ID,因此您需要编写自定义 SQL 查询(使用 HQL 或本机 SQL)来检索仅 ID需要的对象。

List&lt;T&gt; ids,你可以比

final List<YourClass> proxyValues = 
         ids.stream()
            .map(id -> entityManager.getReference(YourClass.class, id))
            .collect(Collectors.toList());

谈到性能,这非常好,因为数据库访问将只完成一次,检索少量数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多