Oracle
 sql >> Base de données >  >> RDS >> Oracle

java.lang.ClassCastException :oracle.sql.TIMESTAMP ne peut pas être converti en java.sql.Timestamp

Le javadoc pour ResultSet.getObject() exige que le type JDBC soit mappé à un type Java comme prescrit par la spécification JDBC (TIMESTAMP -> java.sqlTimestmp) :

Cette méthode renverra la valeur de la colonne donnée en tant qu'objet Java. Le type de l'objet Java sera le type d'objet Java par défaut correspondant au type SQL de la colonne, suivant le mappage des types intégrés spécifiés dans la spécification JDBC.

Comme vous l'avez remarqué, le pilote Oracle est par défaut non conforme à la norme et utilise oracle.sql.TIMESTAMP à la place (qui n'étend pas java.sql.Timestamp ). La bonne nouvelle est que vous pouvez forcer la conformité JDBC en définissant oracle.jdbc.J2EE13Compliant propriété système sur true lors du démarrage de la vm :

java -Doracle.jdbc.J2EE13Compliant=true YourApplication

ou par programmation

System.getProperties().setProperty("oracle.jdbc.J2EE13Compliant", "true")

Une fois que vous faites cela, getResult() renverra des instances de java.sql.Timestamp , comme prévu.

Pour plus de détails, consultez la section pertinente de la documentation du pilote Oracle JDBC, qui décrit plusieurs façons de définir oracle.jdbc.J2EE13Compliant.