【问题标题】:How to write JPA query with boolean condition如何使用布尔条件编写 JPA 查询
【发布时间】: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。 :-)

标签: jpa-2.0 eclipselink jpql


【解决方案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
              猜你喜欢
              • 2020-10-31
              • 1970-01-01
              • 2011-03-22
              • 2020-06-19
              • 1970-01-01
              • 1970-01-01
              • 2017-10-08
              • 2020-10-17
              • 1970-01-01
              相关资源
              最近更新 更多