我有一个与发票实体具有 OneToMany 关系的客户实体。
在普通的旧 sql 中,我可以执行“从客户中选择客户名称、客户年龄、[其他一些字段]、发票在哪里……[在此处进行一些过滤]”,这让我得到了一条包含我需要的字段的准确记录。
在 JPA 中,我使用“从客户 c 中选择 c 加入 c.invoiceCollection where ... [与上述相同的过滤]”
这行得通,但我得到了 Customer 实体及其所有关联的发票。这是胡说八道,因为我从数据库中提取了大量(发票)数据,而我不需要这些数据。我只需要我的客户数据和一张发票,正如 where 子句中指定的那样。
更糟糕的是,我必须遍历 Customer.invoiceCollection 才能找到所需的一张特定发票。这花费了我更多的时间,而且它把我的“where”子句暴露给了中间层。
问题:如 where 子句中定义的那样,是否有 JPA 选择语法从一对多关系中准确获取一条记录?
到目前为止尝试过的事情:a)延迟加载。这不起作用,每当我尝试访问 Customer.invoiceCollection 时都会引发异常。即使它有效,我也会得到一个包含大约 1000 个条目的集合,这是我不需要的。
b) 将我的 jpa 语句更改为“select c,i from Customer c join c.invoiceCollection i where ...”。这将返回一个对象数组,我必须手动将其映射到客户/发票实体。它有效,但它使 ORM 哲学过时了。如果我在我的代码中手动执行从关系数据库记录/字段到 java 对象的所有映射,为什么我需要 JPA?