java - 恢复具有相关实体的实体列表,同时使用 JPQL 或条件 API 省略某些字段
问题描述
我有三个实体:A,B,C
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class A {
private long id;
private String secret;
@Builder.Default
@Valid
@OneToMany(mappedBy = "a", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(value = FetchMode.SUBSELECT)
private List<B> bList = new LinkedList<>();
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class B {
@JoinColumn
private A a;
private long id;
private String secret;
@Builder.Default
@Valid
@OneToMany(mappedBy = "b", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true)
@Fetch(value = FetchMode.SUBSELECT)
private List<C> cList = new LinkedList<>();
}
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class C {
@JoinColumn
private B b;
private long id;
private String secret;
}
我想从数据库中恢复值,除了A 的 id 属于 id 列表的“秘密”。我不希望从 DB 请求 A、B 或 C 的秘密。(实际上数据要复杂得多,我不希望从数据库中获取太多时间的字段)。
我一直在尝试使用 JPQL 或 Criteria API 创建这样的查询,但没有成功,我什至无法获得没有秘密的 B 列表。
例如在 JPQL 中:
Query query = entityManager.createQuery
("SELECT a " +
"FROM A a where a.id in :aIds");
query.setParameter("aIds", aIds);
这将起作用,但不幸的是它还要求 A、B 和 C 的秘密。
我想要的是类似的东西(这段代码显然不起作用):
Query query = entityManager.createQuery
("SELECT a.id, a.bList.id, a.bList.cList.id" +
"FROM A a where a.id in :aIds");
query.setParameter("aIds", aIds);
我无法更改实体(除了添加新的构造函数或方法),因为它们在其他地方和其他查询中使用。
这甚至可能吗?
解决方案
您可以使用您需要的字段创建dto
类并填充它。问题是数据库查询只能返回纯结果。持久性提供者可以将其转换为实体。至于dto
你必须自己解决问题。
您可以得到List<Object[]>
查询结果
select a.id, b.id, c.id
from A a join a.bList b join b.cList c
where a.id in(:aIds)
然后你应该将查询结果转换为 dto
推荐阅读
- python - 使用单个字符串发出完整的 HTTP 请求
- javascript - FullCalendar 资源视图 - 显示前 3 天的周视图
- configuration - 在 Tmux 配置中没有看到/使用 Shell 变量
- c - 如何在 C 中的缓冲区中推送一个字节?
- awk - 我对 awk 很陌生,我正在尝试解析/透视 JIL 以供 SAS 或 Excel 使用
- angular - 通过键入显示国家
- python - 无法将 python datetime.date 对象与 sqlite DATE 匹配
- java - yaml 规范中数组数据类型的 Swagger 代码生成问题
- php - 如何使用 OOP 类将字段添加到 Wordpress 仪表板中的设置>常规
- azure - Azure Devops 需要构建成功才能完成拉取请求