如何使用布尔条件编写 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 供应商。添加使用以下表格:
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条件查询的case语句中使用concat函数
JPA 条件 API:如何使用 IN 关键字并查询另一个谓词的结果?