spring-data-jpa 为什么@JoinColumns的顺序很重要?

mbskvtky  于 2022-11-10  发布在  Spring
关注(0)|答案(1)|浏览(170)

我发现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);
7jmck4yq

7jmck4yq1#

Hibernate不知道如何将特定的列相互Map(尽管它可以通过命名比较来实现,但是......),因此它只需要将它们按照与ID列相同的顺序放置即可。
要了解排序的不同之处,请打开生成的SQL查询的日志记录。

...join PlacePK pk ON pk.COMPANY = m.AREA*emphasized text*

相关问题