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?
3 Réponses :
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)
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.
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 );
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
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>