Spring JPA 查询空检查条件正在删除所有具有空值的行

问题描述 投票:0回答:1

@Query("SELECT p FROM PostDAO p WHERE true OR p.user.institution IS NOT NULL")
这个条件应该等于
@Query("SELECT p FROM PostDAO p WHERE true")

输出也应该相同,但空检查会删除机构为空的所有行。

所以第二个查询应该返回所有帖子并且工作正常,第一个查询应该做同样的事情,但是它删除了机构为空的所有帖子。

也许我搞错了什么?帮助我。

尝试使用“p.user.institution <> null”检查 null 或检查 id“p.user.institution.id = 1” 所以事情是这样的:

SELECT p FROM PostDAO p WHERE true OR p.user.institution <> null
SELECT p FROM PostDAO p WHERE true OR p.user.institution.id = 1

但是每个带有机构 = null 的帖子都已从结果中删除。

PostDAO:

@Entity
@Table(name = "posts")
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PostDAO {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(name = "date", nullable = false)
    private Date date;

    @Column(name = "expiration_date")
    private Date expirationDate;

    @Column(name = "text", columnDefinition = "TEXT")
    private String text;

    @ManyToOne
    @JoinColumn(name="user_id", nullable=false)
    private UserDAO user;

用户DAO:

@Data
@Entity
@Table(name = "users", uniqueConstraints = {
        @UniqueConstraint(columnNames = {"login"})
})
public class UserDAO {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    @Column(name = "login")
    private String login;
    @Column(name = "password")
    private String password;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
    private CompanyDAO company;

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
    private InstitutionDAO institution;

    @ManyToMany
    @JoinTable(
            name = "users_roles",
            joinColumns = @JoinColumn(
                    name = "user_id", referencedColumnName = "id"),
            inverseJoinColumns = @JoinColumn(
                    name = "role_id", referencedColumnName = "id"))
    private Set<RoleDAO> roles;
}
java spring spring-data-jpa jpql
1个回答
0
投票

看起来这里的问题是“where true”无效,而应该是:

“其中 true = true 或 p.user.institution IS NOT NULL”

这应该可以解决您的问题。

我认为“where true”实际上并未被处理,因此您只是返回查询的所有结果

© www.soinside.com 2019 - 2024. All rights reserved.