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

31

在我的项目中,我使用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;

    .......

}

我想创建一个查询,返回所有活跃用户,就像这样:

select u from User u where u.active = TRUE;

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

谢谢


你在使用哪个JPA提供程序(例如Hibernate、EclipseLink、OpenJPA等)?你在使用哪个数据库供应商(MySQL、SQL Server、Oracle)?你在使用哪个JDBC驱动程序? - Edwin Dalorzo
1
我正在使用Eclipselink作为JPA提供程序,Derby作为数据库和Derby客户端JDBC驱动程序,但也使用Spring来创建EntityManager、事务管理等。然后出现了一个问题,我忘记指定JPA供应商。在添加了<property name="jpaVendorAdapter"> <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"/> </property>之后,带有TRUE条件的查询正常工作。 - Rado Skrib
这里也有Derby/Hibernate的同样问题,但是它在MySQL上可以工作。 :-) - Jan Goyvaerts
8个回答

44

请使用以下表单:

SELECT e FROM Employee e WHERE e.active = TRUE

查看文档以获取更多信息。


3
答案是“SELECT e FROM Employee e WHERE e.active = TRUE”,您可以忽略链接。因此,这不是一个“仅有链接的答案”!此外,链接可能无效,任何答案也可能如此!所以链接是任何有兴趣阅读更多信息的人的参考。最后但并非最不重要的,链接是一个维基链接,因此它不仅仅是一个答案,而是获取所需知识的方法!!! - YUIOP QWERT
哇,如果答案不正确,你只需要添加评论。然后它将有助于识别该链接已过时。不知道负投票真正意味着什么。 - YUIOP QWERT

4

MySql的工作方式如下:

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

1

我也遇到了这个问题(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;

    .......
}

0
你可以像这样编写查询语句:
@Query("SELECT u from User u order by u.active");
它将首先显示非活跃用户。如果你想要先看到活跃用户,可以使用以下方式:
@Query("SELECT u from User u order by u.active desc");

0

我正在使用EclipseLink作为JPA提供程序和MySQL数据库。在这种配置下,使用1表示真,0表示假是有效的。


0

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


0
在我的情况下,它正在运作。
findByTitleAndDocumentIdAndIsDeleted(String title, UUID docId, Boolean isDeleted);

-4

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

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


3
"u.active IS TRUE" 对我也不起作用,但是 "u.active = TRUE" 可以。使用 EclipseLink 2.5。 - ctron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接