Hibernate Jpa多对多关系,生成错误的sql查询
我有一个房客对象,他可能有很多联系。同一联系人可与多个房客关联。这是一种多对多的关系 在我的房客中Hibernate Jpa多对多关系,生成错误的sql查询,hibernate,jpa,spring-data,spring-data-jpa,Hibernate,Jpa,Spring Data,Spring Data Jpa,我有一个房客对象,他可能有很多联系。同一联系人可与多个房客关联。这是一种多对多的关系 在我的房客中 @ManyToMany(mappedBy = "lodger") private List<Contact> contactList; 编辑3 @Query("select c from Contact c where :lodgerId not member of c.lodger.lodgerId") List<Contact> findByLodgerLodgerI
@ManyToMany(mappedBy = "lodger")
private List<Contact> contactList;
编辑3
@Query("select c from Contact c where :lodgerId not member of c.lodger.lodgerId")
List<Contact> findByLodgerLodgerIdNot(@Param("lodgerId") Long lodger);
@Query(“从联系人c中选择c,其中:lodgerId不是c.lodger.lodgerId的成员”)
列出findByLodgerLodgerIdNot(@Param(“lodgerId”)长房客);
org.hibernate.QueryException:非法尝试取消引用
具有元素属性的集合[contact0\u.contact\u id.lodger]
参考[寄宿者ID]
从生成的JPQL可以看出,您的映射是错误的:Hibernate在
contact\u id=lodger\u id
上连接表(反之亦然),而不是在contact\u id=contact\u id
上连接表(和lodger\u id=lodger\u id
)
这是因为您使用inverseJoinColumns反转了joinColumns。映射应该是
@JoinTable(name = "lodger_contact",
joinColumns = @JoinColumn(name = "contact_id"),
inverseJoinColumns = @JoinColumn(name = "lodger_id"))
在findByLodgerLodgerIdNot方法中有什么?Spring存储库中,使用name属性和操作通过其名称生成代码。如果您有一个具有firstname属性的类用户。您可以编写一个方法:findByFirstname(stringfirstname),spring将生成如下代码:select*from user where firstname=?更多信息:docs.spring.io/spring data/jpa/docs/current/reference/htmldon似乎不是解决方案。那么您在数据库中没有任何联系人,其中至少有一个房客未通过给定的房客ID识别。true。。。就像我说的,我有一个房客,一个联系人。我搜索与我的房客无关的联系人列表。但现在您的查询就是这样做的。它搜索至少有一个不是房客ID的房客的联系人。您需要以下查询:
从联系人c中选择c,其中:房客不是c的成员。房客
我更新、修改了您的查询,但希望知道是否有办法避免将对象发送到查询。
select
contact0_.contact_id as contact_1_9_,
contact0_.address as address2_9_,
contact0_.city_cityId as city_cit5_9_,
contact0_.contact_sub_category_contactSubCategoryId as contact_6_9_,
contact0_.first_name as first_na3_9_,
contact0_.last_name as last_nam4_9_,
contact0_.phone_phoneId as phone_ph7_9_
from
contact contact0_
left outer join
lodger_contact lodger1_
on contact0_.contact_id=lodger1_.lodger_id
left outer join
lodger lodger2_
on lodger1_.contact_id=lodger2_.lodger_id
where
lodger2_.lodger_id<>?
select
contact0_.contact_id as contact_1_9_,
contact0_.address as address2_9_,
contact0_.city_cityId as city_cit5_9_,
contact0_.contact_sub_category_contactSubCategoryId as contact_6_9_,
contact0_.first_name as first_na3_9_,
contact0_.last_name as last_nam4_9_,
contact0_.phone_phoneId as phone_ph7_9_
from
contact contact0_
left outer join
lodger_contact lodger1_
on contact0_.contact_id=lodger1_.contact_id
left outer join
lodger lodger2_
on lodger1_.lodger_id=lodger2_.lodger_id
where
lodger2_.lodger_id<>?
@Query("select c from Contact c where :lodger not member of c.lodger")
List<Contact> findByLodgerLodgerIdNot(@Param("lodger") Lodger lodger);
select
contact0_.contact_id as contact_1_9_,
contact0_.address as address2_9_,
contact0_.city_cityId as city_cit5_9_,
contact0_.contact_sub_category_contactSubCategoryId as contact_6_9_,
contact0_.first_name as first_na3_9_,
contact0_.last_name as last_nam4_9_,
contact0_.phone_phoneId as phone_ph7_9_
from
contact contact0_
where
? not in (
select
lodger1_.lodger_id
from
lodger_contact lodger1_
where
contact0_.contact_id=lodger1_.contact_id
@Query("select c from Contact c where :lodgerId not member of c.lodger.lodgerId")
List<Contact> findByLodgerLodgerIdNot(@Param("lodgerId") Long lodger);
@JoinTable(name = "lodger_contact",
joinColumns = @JoinColumn(name = "contact_id"),
inverseJoinColumns = @JoinColumn(name = "lodger_id"))