【问题标题】:How avoid taking an object from a query, beyond a certain depth, in java-ee?如何避免在 java-ee 中从查询中获取超过一定深度的对象?
【发布时间】:2016-02-17 19:44:52
【问题描述】:

我正在尝试在我的 Java EE 应用程序中实现“跟随机制”。 我有一个实体配置文件,其中包含一个列表,它是用户遵循的配置文件的列表。 Le 关系是 (@OneToMany)。

一切都很好,听起来很棒,但我有一个问题。像这样的查询:

Query q = em.createQuery("SELECT p FROM Profile p WHERE p.id =:custId");

返回一个 Profile p,到目前为止,没问题。但我注意到我拥有我的关注用户的完全访问权限,以及我所有关注用户的关注,等等。 我看不出有出路。

我可以替换仅包含 id 的数组中的 List,但前提是它是唯一的选择。 有任何想法吗? 我可以通过不让她获取我的每个关注用户的关注列表来“停止”查询吗?

【问题讨论】:

  • 需要更多信息才能提供帮助。可能您的查询是使用急切加载策略执行的,您可以搜索一下如何将其更改为延迟加载。
  • 是的,您可以访问(假设会话仍处于打开状态),但默认情况下是按需获取它们。因此,除非您明确配置了 Eager fetch,否则默认情况下不会加载关联。打开 Sql 日志以查看正在获取的内容。
  • @AlanHay 我认为你是对的。我被所选数据的数量吓到了,但我不再害怕了。感谢您的解释!

标签: java jakarta-ee entity createquery


【解决方案1】:

我认为您需要重构您的 API。不要将关注者列表存储在个人资料类中,创建一个服务,例如 ProfileService 并在您想要访问特定个人资料的关注者列表时调用它。

public class ProfileService {

    public List<Profile> getFollowers(Profile profile) {
       Query q = em.createQuery("SELECT p FROM Profile p WHERE p.id =:custId");
       .....
    }
}

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 2019-12-21
    • 2016-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2014-02-06
    相关资源
    最近更新 更多