web-dev-qa-db-fra.com

Comment écrire une requête JPA avec une condition booléenne

Dans mon projet, j'utilise JPA 2.0 avec une implémentation eclipselink, un problème suivant:

J'ai défini l'entité avec la colonne booléenne:

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

    .......

}

Je veux créer une requête qui retournera tous les utilisateurs actifs, quelque chose comme ceci:

sélectionnez u dans Utilisateur u où u.active = TRUE;

Mais si j'utilise cette requête, j'ai une exception: le booléen ne peut pas être converti en Short (la colonne de la base de données est stockée sous le nom de smallint). Existe-t-il une manière correcte d'écrire cette requête?

Merci

13
Rado Skrib

Utilisez le formulaire suivant:

SELECT e FROM Employee e WHERE e.active = TRUE

Voir la documentation pour plus d'informations:

13
YUIOP QWERT

J'ai aussi eu ce problème (PostgreSQL + Eclipselink) et je l'ai obtenu avec les annotations @TypeConverter et @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;

    .......
}
1
lazlev
SELECT e FROM  Employee e WHERE e.active = TRUE

dans la requête ci-dessus, comment passer TRUE/FALSE en tant que paramètre utilisateur? lorsque j'essaie ci-dessous, ne renvoie pas les valeurs définies par l'utilisateur (TRUE/FALSE).

voici la requête nommée

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

ici j'appelle la requête de nom ci-dessus

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

Vous pouvez écrire une requête comme:

@Query ("SELECT u de l'utilisateur u ordre par u.active"); 

Il affichera les utilisateurs inactifs en premier. Si vous voulez voir un utilisateur actif, utilisez d'abord comme:

@Query ("SÉLECTIONNER U de l'utilisateur u ordre par u.active desc"); 

0
Rahul Chauhan

J'utilise EclipseLink en tant que fournisseur JPA et base de données MySQL. Avec cette configuration, utiliser 1 pour true et 0 pour false fonctionne. 

0
punkyduck

Vous pouvez utiliser @TypeConverter (dataType = Integer.class)

0
James