Как написать запрос JPA с логическим условием - PullRequest
16 голосов
/ 06 июня 2011

В моем проекте я использую 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). Есть ли правильный способ, как написать этот запрос?

Спасибо

Ответы [ 8 ]

15 голосов
/ 07 декабря 2015

Используйте следующую форму:

SELECT e FROM Employee e WHERE e.active = TRUE

См. документы для получения дополнительной информации:

1 голос
/ 24 октября 2017
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);
1 голос
/ 02 декабря 2015

У меня тоже была эта проблема (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 голосов
/ 20 марта 2019

Для MySql это работает:

public interface UserRepository extends JpaRepository<User, Long> {    
    @Query("SELECT e FROM  Employee e WHERE e.active=?1")
    User findByStatus(Boolean active);
}
0 голосов
/ 10 августа 2017

Вы можете написать запрос, например:

@ Query («ВЫБЕРИТЕ пользователя из заказа пользователя u.active»);

Сначала будут отображаться неактивные пользователи.Если вы хотите, чтобы активный пользователь сначала увидел, например:

@ Query («ВЫБЕРИТЕ пользователя из заказа пользователя u.active desc»);

0 голосов
/ 19 июня 2014

TRUE - это специальное ключевое слово.попробуйте

выберите u из User u, где u.active IS TRUE;

0 голосов
/ 01 мая 2012

Вы можете использовать @TypeConverter (dataType = Integer.class)

0 голосов
/ 30 апреля 2012

Я использую EclipseLink в качестве поставщика JPA и базы данных MySQL.В этой конфигурации используется 1 для true и 0 для false работает.

...