Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate Jpa多对多关系,生成错误的sql查询_Hibernate_Jpa_Spring Data_Spring Data Jpa - Fatal编程技术网

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"))