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

时间:2011-06-06 11:02:02

标签: jpa-2.0 eclipselink jpql

在我的项目中我使用JPA 2.0和eclipselink inplementation,我有以下问题:

我用boolean column定义了实体:

@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.active = TRUE;

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

由于

9 个答案:

答案 0 :(得分:13)

使用以下表格:

{{1}}

有关详细信息,请参阅the docs

答案 1 :(得分: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;

    .......
}

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以编写如下查询:

@Query("来自用户的u你选择u.active");

它将首先显示非活动用户。如果您希望看到活跃用户首次使用,请执行以下操作:

@Query("通过u.active desc&#34从User u order中选择你;);

答案 5 :(得分:0)

SELECT e FROM  Employee e WHERE e.active = TRUE

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

这是命名查询

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

这里我称之为上述名称查询

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

答案 6 :(得分:0)

对于MySql来说,这是可行的:

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

答案 7 :(得分:0)

它正在我的场景中运行: findByTitleAndDocumentIdAndIsDeleted(字符串标题,UUID docId,布尔isDeleted);

答案 8 :(得分:-4)

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

  

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