0
votes

Requête native Spring Boot avec paramètre nul

J'ai une requête native dans Spring Boot en tant que telle:

"AND (?3 is null or t.location_1 = cast(?3 as bigint)) " +

Pour l'emplacement1, il peut être nul. Lorsque j'exécute cette requête avec location1 null, elle renvoie le message d'erreur: org.postgresql.util.PSQLException: ERREUR: l'opérateur n'existe pas: bigint = bytea

Après quoi j'ai essayé de lancer sur le paramètre 3:

@Query(value = "SELECT t.* FROM Transaction t WHERE " +
    "t.datetime >= TO_TIMESTAMP(?1,'YYYY-MM-ddTHH:MI') " +
    "AND t.datetime < TO_TIMESTAMP(?2,'YYYY-MM-ddTHH:MI') " +
    "AND (t.location_1 = ?3 or ?3 is null) " +
    "LIMIT ?4",
    nativeQuery = true)
    List<Transaction> findBySearchTerms(@Param("fromDateTime") String fromDateTime,
            String toDateTime,
            Integer location1,
            Integer maxCount
            );

Cela entraîne également une erreur: org.postgresql.util.PSQLException: ERROR: impossible de convertir le type bytea en bigint.

J'ai recherché des éléments similaires questions sur stackoverflow et a suivi certaines des recommandations, mais cela ne fonctionne toujours pas. Des idées?


0 commentaires

3 Réponses :


0
votes

Vous pouvez avoir deux requêtes différentes pour gérer Null et Not Null. Appelez ces deux méthodes basées sur l'emplacement est nul ou non nul

@Query(value = "SELECT t.* FROM Transaction t WHERE " +
"t.datetime >= TO_TIMESTAMP(?1,'YYYY-MM-ddTHH:MI') " +
"AND t.datetime < TO_TIMESTAMP(?2,'YYYY-MM-ddTHH:MI') " +
"AND (t.location_1 = ?3 ) " +
"LIMIT ?4", nativeQuery = true)

@Query(value = "SELECT t.* FROM Transaction t WHERE " +
"t.datetime >= TO_TIMESTAMP(?1,'YYYY-MM-ddTHH:MI') " +
"AND t.datetime < TO_TIMESTAMP(?2,'YYYY-MM-ddTHH:MI') " +
"AND (t.location_1 is null) " +
"LIMIT ?4",
nativeQuery = true)


1 commentaires

Merci, je suppose que c'est le seul moyen pour le moment. La solution deviendra compliquée lorsque j'aurai plus d'un paramètre pouvant être nul.



1
votes

Inversez simplement votre paramètre dans une requête comme celle-ci.

@Query(value = "SELECT t.* FROM Transaction t WHERE " +
    "t.datetime >= TO_TIMESTAMP(?1,'YYYY-MM-ddTHH:MI') " +
    "AND t.datetime < TO_TIMESTAMP(?2,'YYYY-MM-ddTHH:MI') " +
    "AND ( ?3 is null or t.location_1 = ?3) " +
    "LIMIT ?4",
    nativeQuery = true)
    List<Transaction> findBySearchTerms(@Param("fromDateTime") String fromDateTime,
            String toDateTime,
            Integer location1,
            Integer maxCount
            );


2 commentaires

Ne fonctionne pas pour moi, le message d'erreur indique le numéro de position en cours de modification. Il évaluera toujours la deuxième portion t.location_1 =? 3


pour la comparaison de chaînes, n'utilisez pas t.location_1 =? 3 mais utilisez t.location_1 LIKE? 3



5
votes

J'ai eu le même problème et j'ai réussi à le résoudre en le castant en BIGINT mais d'abord en TEXT puis en BIGINT. J'utilise Spring Boot 2.2 et Kotlin, mais il en va de même pour Java.

J'ai l'exemple suivant:

Caused by: org.postgresql.util.PSQLException: ERROR: cannot cast type bytea to bigint

Si je ne le lance pas, j'obtiens une erreur:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: bigint = bytea
  Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts

et II lancez-le une seule fois en BIGINT, l'erreur est:

 @Query(
        """
         SELECT
         f.id,
         f.name,
         c.id AS company_id,
         c.name AS company_name
         FROM facility f
         WHERE (:companyId IS NULL OR f.company_id = CAST(CAST(:companyId AS TEXT) AS BIGINT))  
        """
)
@Transactional(readOnly = true)
    fun exampleMethod(@Param("companyId") companyId: Long? = null):List<Result>


0 commentaires