如何解决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 秒。我应该在代码中做些什么来让它运行得更快?
-
我要求不需要来自其他表的数据(通过映射检索)。我只需要来自 TableA 的数据。我尝试了下面的命名查询,但它对 TableA 中的每一行运行单独的查询,这需要 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
创建一个代理
并且不需要访问数据库上的表,除非您稍后需要使用该集合。
对于有类似问题的人
Question 1 in OP : https://stackoverflow.com/questions/61573091/long-time-of-fetching-data-from-oracledb-using-eclipselink
Question 2 in OP: Solved using @Davide solution
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。