ManyToOne Outer加入单个查询(1到0关系)

时间:2016-02-17 15:06:29

标签: java hibernate hibernate-mapping

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

获得了2个表之间的映射

表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;

我正在进行这样的查询:

select table1 from Table1 table1 left outer join table1.table2

结果还可以:获取table1中的所有数据和一些table2(某些table1没有指向table2的链接),因此外连接正常。

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

首先,您需要将table2的抓取更改为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;

如果您需要在Table1中获得具有某些属性的table2,请使用加入

from Table1 table1 left join table1.table2 table2 where table2.someProperty = :somePropertyValue

如果您需要加载table2,请使用联接提取

from Table1 table1 left join fetch table1.table2 table2 where table2.someProperty = :somePropertyValue

如果您只需要部分table2使用投影

select table1.property1, table1.property2, table2.someProperty from Table1 table1 left join table1.table2 table2 where table2.someProperty = :somePropertyValue

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

select new com.pack.TableDto(table1.property1, table1.property2, table2.someProperty) from Table1 table1 left join table1.table2 table2 where table2.someProperty = :somePropertyValue

或者您可以使用变压器。

答案 1 :(得分:0)

由于Table1(父级)是EAGER而您从Table1中选择,因此对于Table2中的每一行,Hibernate都会发出查询以填充table2参考。一种解决方案是在第一个查询上加入fetch $(function(){ $('#target1').on('click', function(){ $('#landingContainer').css('background-color', 'green'); }); }); 引用。 这是使用HQL时Hibernate的已知行为(使用Criteria API我不认为它适用)。 我已经在博客上详细介绍了它here