java - JPA - 在 EclipseLink 中的 namedQuery 中忽略连接操作
问题描述
我有以下情况
实体表A:
@Entity @Table(name = "TABLE_A") @NamedQueries({ @NamedQuery(name = "TableA.namedQ1", query = "SELECT t1 FROM TableA t1 JOIN FETCH t2.TableB t2" + " WHERE <conditions here>"), @NamedQuery(<Need query here which will ignore mapping below and return rows only for TableA>) } ) public class TableA implements Serializable{ @Id @Column(name = "id") private int id ... ... ... @OneToMany(mappedBy = "tableA", cascade = CascadeType.ALL ,fetch=FetchType.LAZY) private List<TableB> tableB; }
实体表B:
@Entity @Table(name = "TABLE_B") public class TableB implements Serializable{ @Id @Column(name = "id1") private int id1 ... ... ... @ManyToOne @JoinColumn(name = "id",insertable = false, updatable = false) private TableA tableA; }
我面临以下两个问题:
上面提到的查询即
SELECT t1 FROM TableA t1 JOIN FETCH t2.TableB t2
需要很长时间才能执行。大约 30 秒。但是在 SQL 开发人员中,对相同数据集的相同查询几乎不需要 3-4 秒。ANythnig 我应该在代码中做些什么来让它运行得更快?
我有不需要来自其他表的数据的要求(通过映射检索)。我只需要来自 TableA 的数据。我尝试了下面的命名查询,但它对 TableB 中的每一行运行单独的查询,这需要 4 分钟以上的时间才能执行。
"SELECT t1 FROM TableA t1 where <condition goes here>"
我必须在查询中进行哪些修改才能忽略映射。我需要保留注释(@OneToMany),因为我将在 namedQ1 中需要它。
感谢期待
解决方案
使用 时FETCH
,您要求提前检索集合的数据。如果您不需要 TableB 中的元素,那么您的查询应该是:
SELECT t1 FROM TableA t1 left join t1.tableB t2
请注意,仅当您需要向 t2 添加一些条件时才需要连接。例如:
SELECT t1 FROM TableA t1 left join t1.tableB t2 WHERE t2.field = 123
如果这不是你的情况,那么这就足够了:
SELECT t1 FROM TableA t1;
在所有这些情况下,它将为集合创建一个代理,TableB
并且不需要访问数据库上的表,除非您以后需要使用该集合。
推荐阅读
- javascript - 如何在悬停时设置 Bootstrap 下拉菜单?
- reactjs - 在 CI 管道上构建项目以及尝试通过 Yarn 添加包时出现错误“错误找不到包“XXX”
- python - 如果它们不在预选列表中,如何遍历图中的边
- c - Libcurl 将更改请求从 PUT 上传到 POST
- r - 如何通过传递字符向量重命名 tibble 中的所有列名?
- java - 扫描仪扫描输入后,我需要输入 2 次数字
- angular - 如何为 ngSelect 选项添加工具提示?在将选项悬停在下拉列表中时,我需要显示工具提示
- javascript - fetch 在使用身份验证进行 cors 请求时拒绝响应代码为 200 的请求
- kubernetes - 当 kubernetes pod 启动时,嵌套异常是 java.net.UnknownHostException
- asp.net-core - 从 ASP.NET Core 2.2 迁移到 3.1