java - 在 JPA 实体中,如何定义 getter 上使用的 SQL?

标签 java jpa eclipselink

我有一个名为 PetOwner 的实体。 PetOwner 有一个宠物列表。每个宠物都有一个商店(即:该宠物来自的商店)。 Pet 是一个抽象类,获取具体版本需要进行大量连接 (@Inheritance(strategy = InheritanceType.JOINED))。我想在 PetOwner 上有一个带有此签名的方法:

Set<Store> getAllStores();

问题是加载宠物列表非常慢,实际上没有必要获取商店列表。当我调用 getAllStores 时,我希望它像这样运行 SQL:

SELECT DISTINCT store_id
FROM pet
WHERE petowner_id = x;

但是如果我像这样实现它:

Set<Stores> stores = //
for (pet : pets)
   stores.add(pet.getStore());
return stores;

它会吸引所有宠物,而且速度非常慢。那么如何防止它拉入所有宠物呢?理想情况下,我确实希望在 PetOwner 对象上使用此方法,因为我认为代码 这样更加面向对象。

此外,PetOwner 内部还有其他方法,我确实需要加载宠物列表,尽管速度很慢。但我并不总是调用它,这就是为什么我想用这个方法来避免 正在加载宠物列表。

最佳答案

没有标准方法可以执行此操作,因为您没有映射此数据。我看到的不同选项是

  1. 直接在 EM 上使用命名查询
  2. 将方法添加到 PetOwner 中,该方法采用 ENntityManager 并执行以下操作 直接查询,或者
  3. 向宠物主人添加临时列表并在加载后填充它 运行查询的事件。但这将无法看到更新 除非重新加载 PetOwner。

关于java - 在 JPA 实体中,如何定义 getter 上使用的 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14762189/

相关文章:

java - 用对象包裹集合属性

java - 单个事务中刷新和持久化时的多个约束违规

java - 如何在jasperreports中安装新字体

java - 单击 PositiveButton 并且条件不成立时防止对话框关闭

java - EntityManager.remove 和 EntityManager.persist 上的 JPA 重复条目错误

java - JPA 我应该使用字段访问、create.query、update.query 或属性访问、查找和 setter

java - Spring Boot 默认测试抛出 IllegalStateException

java - JPA 枚举类型作为数据库中的表

intellij-idea - EclipseLink 静态编织与 Intellij

java - JPA 使用指南/Eclipselink/JPA 实体生成器