【发布时间】:2021-04-02 20:37:41
【问题描述】:
我有以下场景
-
实体表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 中需要它。
感谢期待
【问题讨论】:
-
如果TableA的内容足够了,就用JOIN代替JOIN FETCH(见stackoverflow.com/questions/17431312/…)。
-
@user871611 我试过提到的帖子。但它为 TableA 中的每一行触发子查询
-
似乎您正在访问 TableB 中的字段。如果是这样(并且您确实需要来自 TableB 的数据)JOIN FETCH 是您的朋友,并且您的 SQL 客户端要快得多,因为它只从 TableA 中获取数据。这是我的猜测。
标签: java database hibernate jpa eclipselink