2011-06-06 69 views
8

在我的项目我使用JPA 2.0的EclipseLink inplementation,一个我有以下问题:如何编写与布尔条件JPA查询

我与布尔列定义的实体:

@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;

但是,如果我使用该查询,我得到异常,布尔值不能转换为短(数据库中的列存储为smallint)。有没有正确的方法来编写这个查询?

谢谢

+0

什么JPA的供应商?您使用的是哪种数据库供应商(MySQL,SQL Server,Oracle)?您使用的是什么JDBC驱动程序? – 2011-06-08 19:56:06

+0

我使用Eclipselink作为JPA提供程序,Derby作为数据库和Derby客户端jdbc驱动程序,但也使用Spring创建EntityManager,事务管理...而且还有一个问题,我忘记指定JPA供应商。在添加 查询TRUE条件工作。 – 2011-06-09 10:29:48

+0

在这里和Derby/Hibernate一样。但它适用于MySQL。 :-) – 2012-04-03 13:02:19

回答

0

我使用EclipseLink作为JPA提供程序和MySQL数据库。使用此配置,将1用于true,将0用于虚假作品。

0

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

-3

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

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

+3

“u.active IS TRUE”也不适用于我,但是“u.active = TRUE”。使用EclipseLink 2.5 – ctron 2015-03-05 12:02:04

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; 

    ....... 
} 
8

使用以下格式:

+1

的答案是“SELECT e FROM Employee e WHERE e.active = TRUE”,您可以忽略该链接。所以它不是“只有链接的答案”!此外,链接可能无效,所以任何答案!因此,链接是任何有兴趣阅读更多内容的人的参考。最后但并非最不重要的一点,这个链接是一个维基链接,所以它不过是一个答案,而是一种获得你想知道的东西的方法! – 2015-12-08 03:02:22

+0

哇,如果答案是错误的,你可以添加你的评论。然后认识到链接已经过时将是有用的。不知道降价是什么意思。 – 2015-12-09 05:16:28

0

你可以编写查询:

SELECT e FROM Employee e WHERE e.active = TRUE

更多信息,请参见the docs

@Query(“从用户选择U U order by u.active“);

它将首先显示非活动用户。如果你想看到积极的用户第一次使用,如:

@Query(“选择u从用户u订单由u.active desc”);

0
SELECT e FROM Employee e WHERE e.active = TRUE 

在上面的查询中,如何将TRUE/FALSE作为用户参数传递? 当我在下面尝试时,它不会根据用户输入返回值(TRUE/FALSE)。

这里是命名查询

 SELECT e FROM Employee e WHERE e.active = :inputValue 

这里我所说的上述名称查询您使用的(即休眠,的EclipseLink,OpenJPA的,等等)

Query getEmployeesByState= entityManager.createNamedQuery("above query name"); 
    getEmployeesByState.setParameter("active", Boolean.FALSE); 
+0

对不起,这是一个问题。但我不能添加评论,所以发布的问题作为回答 – user2555212 2017-10-24 06:35:06

+0

然后,你应该张贴问题作为一个问题。我认为你应该删除这篇文章和[创建一个新问题](https://stackoverflow.com/questions/ask)。您刚刚发布的帖子不会显示在首页,因此很少有人会看到它。如果你创建一个新的问题,你会得到更多的答案。请务必阅读[如何提出问题](https://stackoverflow.com/help/how-to-ask) – Wndrr 2017-10-24 06:55:27