如何使用布尔条件编写 JPA 查询

Posted

技术标签:

【中文标题】如何使用布尔条件编写 JPA 查询【英文标题】:How to write JPA query with boolean condition 【发布时间】:2011-09-09 05:06:23 【问题描述】:

在我的项目中,我使用 JPA 2.0 和 eclipselink 实现,我遇到了以下问题:

我已经用布尔列定义了实体:

@Entity
public User 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="USR_ID")
    private Short id;

    @Column(name="USR_NAME")
    private String name;

    @Column(name="USR_ACTIVE")
    private boolean active;

    .......


我想创建将返回所有活动用户的查询,如下所示:

从用户 u 中选择 u 其中 u.active = TRUE;

但是,如果我使用该查询,则会出现布尔值无法转换为 Short 的异常(数据库中的列存储为 smallint)。有没有正确的方法来编写这个查询?

谢谢

【问题讨论】:

您使用的是哪个 JPA 提供程序(即 Hibernate、EclipseLink、OpenJPA 等)?您使用的是哪个数据库供应商(mysql、SQL Server、Oracle)?您使用的是什么 JDBC 驱动程序? 我使用 Eclipselink 作为 JPA 提供程序,使用 Derby 作为数据库和 Derby 客户端 jdbc 驱动程序,还使用 ​​Spring 来创建 EntityManager、事务管理......还有一个问题,我忘记指定了JPA 供应商。添加 查询条件为 TRUE 后。 这里与 Derby/Hibernate 相同。但它适用于 MySQL。 :-) 【参考方案1】:

使用以下表格:

SELECT e FROM Employee e WHERE e.active = TRUE

请参阅the docs 了解更多信息。

【讨论】:

答案是“SELECT e FROM Employee e WHERE e.active = TRUE”,你可以忽略这个链接。所以它不是“仅链接的答案”!此外,链接可能无效,任何答案也是如此!因此,该链接是任何有兴趣阅读更多内容的人的参考。最后但并非最不重要的一点是,该链接是一个 wiki 链接,因此它不仅仅是一个答案,而是一种获取您想知道的东西的方法!!! 哇,如果答案是错误的,你可以添加你的评论。然后识别链接已过期将很有用。不知道反对票的真正含义。【参考方案2】:

MySql 可以这样工作:

public interface UserRepository extends JpaRepository<User, Long>     
    @Query("SELECT e FROM  Employee e WHERE e.active=?1")
    User findByStatus(Boolean active);

【讨论】:

【参考方案3】:

我也遇到了这个问题(PostgreSQL + Eclipselink),并让它与@TypeConverter@Convert 注释一起工作。

@Entity
@TypeConverter(name = "booleanToInteger", dataType = Integer.class)
public User 

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="USR_ID")
    private Short id;

    @Column(name="USR_NAME")
    private String name;

    @Column(name="USR_ACTIVE")
    @Convert("booleanToInteger")
    private boolean active;

    .......

【讨论】:

【参考方案4】:

我使用 EclipseLink 作为 JPA 提供程序和 MySQL 数据库。使用此配置,使用 1 表示真,使用 0 表示假。

【讨论】:

【参考方案5】:

你可以使用@TypeConverter(dataType=Integer.class)

【讨论】:

【参考方案6】:

您可以编写如下查询:

@Query("SELECT u from User u order by u.active");

它将首先显示非活动用户。如果你想看到活跃用户首先使用:

@Query("SELECT u from User u order by u.active desc");

【讨论】:

【参考方案7】:

它在我的场景中工作: findByTitleAndDocumentIdAndIsDeleted(String title, UUID docId, Boolean isDeleted);

【讨论】:

【参考方案8】:

TRUE 是一个特殊的关键字。 试试

从用户 u 中选择 u,其中 u.active 为真;

【讨论】:

"u.active IS TRUE" 对我也不起作用,但 "u.active = TRUE" 对我有用。使用 EclipseLink 2.5

以上是关于如何使用布尔条件编写 JPA 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何编写与集合完全匹配的 JPA 条件查询?

如何在使用jpa条件查询的case语句中使用concat函数

JPA 条件 API:如何使用 IN 关键字并查询另一个谓词的结果?

如何根据postgres的jsonb列的where条件(无本机查询)使用jpa在spring boot中选择数据?

Spring Data JPA:如何形成条件查询?

如何在 JPA Criteriabuilder Select 语句中执行子查询?