Java 不为NULL始终返回真的JPA查询

Java 不为NULL始终返回真的JPA查询,java,spring,postgresql,spring-data-jpa,jpql,Java,Spring,Postgresql,Spring Data Jpa,Jpql,我有两个实体用户和帐户。两者都有一对一映射。 以下是实体类: 用户: @Entity @Table(name = 'docutools_users') public class DocutoolsUser { @Id @Type(type = "pg-uuid") UUID id = UUID.randomUUID(); @OneToOne(mappedBy = "user", cascade = ALL) Account account;} 账户 @Entit

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

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

   @OneToOne(mappedBy = "user", cascade = ALL)
   Account account;}
账户

@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;
}
查询

@Query("SELECT u FROM DocutoolsUser u WHERE u.account IS NOT NULL")
Page<DocutoolsUser> findByAccountNotNull()
@Query(“从DocutoolsUser u中选择u,其中u.account不为空”)
页面findByAccountNotNull()
我正在使用JPA repositery。 表达式u.account不为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)
@Query(““”从DocutoolsUser u中选择u,其中u.organization=:org和UPPER(CONCAT(u.name.firstName,,,u.name.lastName)),如:搜索和((u.id=u.organization.owner.id和u.account为NULL)或(u.account.subscription.until为NULL或u.account.subscription.until>:currentDate)时的大小写)则true ELSE false END)为:isLicensed“”)
Page FindByorOrganizationAndLicense(@Param('org')Organization,@Param('search')字符串搜索,@Param('currentDate')LocalDate currentDate,@Param('isLicensed')布尔值isLicensed,可分页)

您可以在不使用@Query的情况下使用JpaRepositoryIsNotNull

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

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

}
@存储库
公共接口DocutoolsUserRepository扩展了JpaRepository{
//何处帐户不为空
公共列表findbyaccountsnotnull();
}
有关更多信息:


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

删除您的
@query
,只需使用
findbyaccountsnoull
谢谢,但我的整个查询有一些复杂的逻辑,因此我无法使用此查询,这是整个查询,我认为您需要使用
LEFT JOIN FETCH
来确保正确加载关系。否则,Hibernate可能会根据需要将中间代理对象延迟加载到帐户。请看:。谢谢Anthony,LEFT JOIN FETCH正在抛出错误,但只有LEFT JOIN to Account对我有效。