Java 当使用spring boot starter JPA时,JPA findDistinctPropertyBy magic方法无法按预期工作

Java 当使用spring boot starter JPA时,JPA findDistinctPropertyBy magic方法无法按预期工作,java,hibernate,jpa,spring-boot,Java,Hibernate,Jpa,Spring Boot,这就是我遇到的问题 我正在用JPA建立一个数据库模型结构,它有一个多对多的关系,这里是类模型 public class UserActivityRelation{ @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id",nullable = false) private User participant; @ManyToOne(fetch = FetchType.LAZY) @Jo

这就是我遇到的问题

我正在用JPA建立一个数据库模型结构,它有一个多对多的关系,这里是类模型

public class UserActivityRelation{
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "user_id",nullable = false)
    private User participant;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "activity_id",nullable = false)
    private Activity activity;
}
下面是我在spring文档中遵循的相应DAO代码

sql代码看起来非常复杂,但要点很清楚,findDistinct只对主键id而不是参与者--user_id有效,并且它使用了大量的左外连接

起初我认为我写的方法是错误的,所以我用另一个方法名来测试它

你可以看到它在中间没有任何与模型类有关的东西,既没有属性也没有方法…它只是给出了一个相同的sql语句,我很困惑地看到


那么,这仅仅是JPA与hibernate一起工作的方式,还是我做错了?

这是Spring数据JPA中查询创建的方式。它选择不同的UserActivityRelation,这是基于id完成的。没有选择不同的东西。简单地忽略,直到part.M。Deinum如果是这样,findDistinct没有任何意义。id是数据库中每一行的唯一标识符,我将其配置为自动递增,根本不需要使用distinct。此外,虽然没有distinct,但sql代码没有那么多外部左连接部分,只有末尾的where子句。为什么在使用distinct时会生成这些无用的join子句?distinct可能有用,具体取决于您编写的查询方法。可能是生成的查询多次返回同一行,并且您希望它限制它。为什么它会生成查询呢?我不知道,我想如果你使用play criteria API并执行一个独特的操作,可能会创建类似的查询。好的。。我懂了。也许我应该使用jpa criteria api而不是findBy方法,尽管有点少。。那是你说的play criteria API吗?不是,那是一个打字错误,应该是普通的criteria API。这就是基本的JPA标准API,它是Spring数据JPA中查询创建的工作方式。它选择不同的UserActivityRelation,这是基于id完成的。没有选择不同的东西。简单地忽略,直到part.M。Deinum如果是这样,findDistinct没有任何意义。id是数据库中每一行的唯一标识符,我将其配置为自动递增,根本不需要使用distinct。此外,虽然没有distinct,但sql代码没有那么多外部左连接部分,只有末尾的where子句。为什么在使用distinct时会生成这些无用的join子句?distinct可能有用,具体取决于您编写的查询方法。可能是生成的查询多次返回同一行,并且您希望它限制它。为什么它会生成查询呢?我不知道,我想如果你使用play criteria API并执行一个独特的操作,可能会创建类似的查询。好的。。我懂了。也许我应该使用jpa criteria api而不是findBy方法,尽管有点少。。那是你说的play criteria API吗?不是,那是一个打字错误,应该是普通的criteria API。这就是基本的JPA标准API,它是Spring数据JPA中查询创建的工作方式。它选择不同的UserActivityRelation,这是基于id完成的。没有选择不同的东西。简单地忽略,直到part.M。Deinum如果是这样,findDistinct没有任何意义。id是数据库中每一行的唯一标识符,我将其配置为自动递增,根本不需要使用distinct。此外,虽然没有distinct,但sql代码没有那么多外部左连接部分,只有末尾的where子句。为什么在使用distinct时会生成这些无用的join子句?distinct可能有用,具体取决于您编写的查询方法。可能是生成的查询多次返回同一行,并且您希望它限制它。为什么它会生成查询呢?我不知道,我想如果你使用play criteria API并执行一个独特的操作,可能会创建类似的查询。好的。。我懂了。也许我应该使用jpa criteria api而不是findBy方法,尽管有点少。。那是你说的play criteria API吗?不是,那是一个打字错误,应该是普通的criteria API。所以基本的JPA标准API。
public List<UserActivityRelation> findDistinctParticipantByParticipantAndActivity(User user, Activity activity);
select distinct useractivi0_.id as id1_1_, useractivi0_.created_time 
as created_2_1_, useractivi0_.modified_time as modified3_1_,
useractivi0_.activity_id as activity5_1_, useractivi0_.user_id as
user_id6_1_, useractivi0_.status as status4_1_ from act_users 
useractivi0_ left outer join users user1_ on useractivi0_.user_id=user1_.id 
left outer join activities activity2_ on 
useractivi0_.activity_id=activity2_.id where (user1_.id is null) 
and (activity2_.id is null)