IS NOT NULL 总是返回真 JPA 查询

Dev*_*per 3 java postgresql spring jpql spring-data-jpa

我有两个实体用户帐户。两者都有一对一的映射。这是实体类: 用户

@Entity
@Table(name = 'docutools_users')
public class DocutoolsUser {
   @Id
   @Type(type = "pg-uuid")
   UUID id = UUID.randomUUID();

   @OneToOne(mappedBy = "user", cascade = ALL)
   Account account;}
Run Code Online (Sandbox Code Playgroud)

帐户

@Entity
@Table(name = "accounts")
public class Account {

  @Id
  @Type(type = "pg-uuid")
  private UUID id = UUID.randomUUID();
  @Column(nullable = false)
  private LocalDate activated = LocalDate.now();
  @OneToOne
  private DocutoolsUser user;
}
Run Code Online (Sandbox Code Playgroud)

询问

@Query("SELECT u FROM DocutoolsUser u WHERE u.account IS NOT NULL")
Page<DocutoolsUser> findByAccountNotNull()
Run Code Online (Sandbox Code Playgroud)

我正在使用 JPA 存储库。即使用户中没有帐户,表达式u.account IS NOT NULL 也始终返回true

谢谢

准确查询在这里

 @Query("""SELECT u FROM DocutoolsUser u WHERE u.organisation = :org AND UPPER(CONCAT(u.name.firstName, ' ', u.name.lastName)) LIKE :search AND ((CASE WHEN ( (u.id = u.organisation.owner.id AND u.account IS NULL) OR ( u.account IS NOT NULL AND (u.account.subscription.until IS NULL or u.account.subscription.until > :currentDate)) ) THEN true ELSE false END) IS :isLicensed )""")
Page<DocutoolsUser> findByOrganisationAndLicense(@Param('org') Organisation organisation, @Param('search') String search, @Param('currentDate') LocalDate currentDate, @Param('isLicensed') Boolean isLicensed, Pageable pageable)
Run Code Online (Sandbox Code Playgroud)

Azz*_*hem 5

您可以使用JpaRepositoryIsNotNull 在没有 @Query 的情况下执行此操作

@Repository
public interface DocutoolsUserRepository  extends JpaRepository<DocutoolsUser, Long> {

// where Account not null
 public List<DocutoolsUser> findByAccountIsNotNull();

}
Run Code Online (Sandbox Code Playgroud)

更多信息:https : //docs.spring.io/spring-data/jpa/docs/1.5.0.RELEASE/reference/html/jpa.repositories.html

对于整个查询,您可以组合许多 jpaRepository 服务