我正在努力解决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不想要它。
感谢您的帮助!
答案 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