Java 单个查询中的多个外部联接(1到0关系)

Java 单个查询中的多个外部联接(1到0关系),java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在努力解决hibernate中的映射问题 得到了两个表之间的映射 表1 @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name="CNT_ID",referencedColumnName = "CNT_ID",insertable = false, updatable = false) @NotFound(action=NotFoundAction.IGNORE) private Table2 table2;

我正在努力解决hibernate中的映射问题

得到了两个表之间的映射

表1

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="CNT_ID",referencedColumnName = "CNT_ID",insertable = false, updatable = false)
    @NotFound(action=NotFoundAction.IGNORE)
    private Table2 table2;
表2

@OneToMany(mappedBy="table2")
private List<Table1> table1List;
结果是确定的:获得了表1和一些表2中的所有数据(一些表1没有到表2的链接),因此外部联接是确定的

问题是hibernate正在进行一次查询以捕获所有table1,并在对table1的每行结果进行一次查询之后进行查询。 所以,如果我在表1中有100行,hibernate将进行101个查询

我错过什么了吗?我正在使用oracle数据库,也尝试(+)操作符(oracle中的外部操作符),但hibernate不需要它


谢谢你的帮助

因为
Table2
(父级)是急切的,并且您正在从
Table1
中进行选择,对于
Table1
中的每一行,Hibernate将发出一个查询来填充
Table2
引用。一种解决方案是在第一次查询时加入fetch
table2
reference。 这是Hibernate在使用HQL时的已知行为(对于CriteriaAPI,我认为它不适用)。
我在博客中详细介绍了它

首先,您需要将
table2
的fetch更改为
FetchType.LAZY
。如果你没有充分的理由急切地获取关联的
@ManyToOne
部分,那么一定要这样做

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CNT_ID",referencedColumnName = "CNT_ID",insertable = false, updatable = false)
@NotFound(action=NotFoundAction.IGNORE)
private Table2 table2;
如果需要获取在
table2
中具有某些属性的
Table1
,只需使用联接即可

来自表1表1左连接表1.2表2
其中table2.someProperty=:somePropertyValue

如果需要加载
表2
,请使用连接提取

来自表1表1左连接获取表1.2表2
其中table2.someProperty=:somePropertyValue

如果您只需要表2的一部分,请使用投影

选择table1.property1、table1.property2、table2.someProperty
从表1表1左连接表1.2表2
其中table2.someProperty=:somePropertyValue

如果要使用投影,可以使用
new
语法填充DTO对象

选择新建com.pack.TableDto(table1.property1、table1.property2、table2.someProperty)
从表1表1左连接表1.2表2
其中table2.someProperty=:somePropertyValue


或者您可以使用转换器。

没有时间写一个好的答案,所以只需一条注释->使用left join fetch即可。如果我记得正确的话,获取策略只适用于非自定义查询。谢谢你的回答Isah,我将查看你的博客,之后会更新我的答案,以确定它是否有效。我已经回答了v.ladynev,我已经阅读了你的博客,left join的问题是,我只获得了带有指向table2的链接的table1数据,而不是没有table2的table1数据使用
内部联接获取table1。table2
而不是
left join获取
。很抱歉,我刚刚尝试了内部联接获取,但问题仍然存在,仅获取带有表2链接的表1。
内部联接获取
-返回包含表2数据的表1<代码>左连接提取-返回包含或不包含table2数据的table1数据。就这些。谢谢你的回答,问题是当我进行左连接时,我只检索到表1,其中有一个到表2的链接,我的一些表1数据没有到表2的链接(关系大于1或0)。这就是为什么我试着用一个外部抓取。
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CNT_ID",referencedColumnName = "CNT_ID",insertable = false, updatable = false)
@NotFound(action=NotFoundAction.IGNORE)
private Table2 table2;