我发现Hibernate有一些奇怪的行为。我在两个实体之间有一个一对多的关系,这两个实体使用嵌入式复合主键,就像这样。(是的,我知道数据设计很糟糕,但这是我必须使用的模式)
第一个
但是,在查询地点的模式时,生成的HQL最终会像这样排序
where
company=?
and color=?
and area=?
并且它结束了对第二个?
的结合区域和对第三个?
的颜色。
除非我改变@JoinColumn
的顺序,将颜色放在区域之前,否则它不起作用。
@JoinColumns({
@JoinColumn(name = "COMPANY", insertable = false, updatable = false),
@JoinColumn(name = "COLOR", insertable = false, updatable = false),
@JoinColumn(name = "AREA", insertable = false, updatable = false),
})
所以我的问题是,是什么导致了这种行为?是什么决定了HQL中where子句的顺序?这不是什么问题,因为我已经找到了使它工作的方法,但我想了解它。
我使用的是spring-boot-starter-data-jpa:1.5.10-RELEASE
,它使用Hibernate 5。
编辑
下面是我如何生成HQL
@Repository
public interface PlaceRepository extends JpaRepository<Place, PlacePK> {}
然后在测试中:
PlacePK placePK = new PlacePK();
placePK.setCompany("Acme");
placePK.setArea("XYZ");
place.PK.setColor("Blue");
Place place = placeRepository.findOne(placePK);
List<Mode> modes = place.getModes(); // ends up being an empty PersistBag until I switch the order of the @JoinColumns
assertNotNull(modes);
1条答案
按热度按时间7jmck4yq1#
Hibernate不知道如何将特定的列相互Map(尽管它可以通过命名比较来实现,但是......),因此它只需要将它们按照与ID列相同的顺序放置即可。
要了解排序的不同之处,请打开生成的SQL查询的日志记录。