Causés par: java.lang.ClassCastException: java.sql.Horodatage ne peut pas être lancé à java.sql.Date
Je suis l'obtention de la donnée ci-dessous d'erreur pour les extraits de code suivants:
try {
cRows = new CachedRowSetImpl();
while(cRows.next())
{
MyClass myClass = new MyClass();
myClass.setPrevDate(cRows.getDate("PREV_DATE")); //In debug mode, the error was throwing when I press Resume from here.
}
}
Erreur:
Caused by: java.lang.ClassCastException: java.sql.Timestamp cannot be cast to java.sql.Date
Dans la base de données, le type de données pour la colonne est DATE
seulement. Je ne suis pas en mesure de savoir où l' Timestamp
est de venir ici.
donnez-moi votre classes alors je peux vous aider
Nous avons besoin de voir la CachedRowSetImpl et MyClass code.
Cela aide
Qui n'a pas fonctionné pour moi. La valeur de ma colonne est
Nous avons besoin de voir la CachedRowSetImpl et MyClass code.
Cela aide
http://stackoverflow.com/questions/20130129/error-java-sql-timestamp-cannot-be-cast-to-java-sql-date-in-jfreechart
CachedRowSetImpl
est de import com.sun.rowset.CachedRowSetImpl;
Qui n'a pas fonctionné pour moi. La valeur de ma colonne est
18-09-14
et est DATE
dans le type.OriginalL'auteur NaaN | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
Obsolète:
Utilisation
java.util.Date
pour le champ.java.sql.Timestamp
est une conséquence directe de sous-classe. Comme c'estjava.sql.Date
- que des bandes de la partie. Pourquoi la java pilote de base de données prend DATE en Timestamp est un peu bizarre. Qu'est-ce que le fournisseur de base de données? Avez-vous spécifier une longueur? Sont en effet uniquement les dates stockées?Recherché:
J'ai regardé dans CachedRowSetImpl.java, et Oracle docs et Oracle fait tout beaux (java.sql.Date, java.sql.Temps, java.sql.Timestamp convertibles).
Le CachedRowSetImpl n'a tout simplement jeté à la DATE de l'Objet (et getObject est susceptible de renvoyer à la haute résolution de l'Horodatage - avec le temps) de java.sql.Date, et c'est mauvais.
Donc remplacer ou substitut ce soleil de la classe.
Oracle 11g
. En dehors de cela, String , double, etc sont à l'aide, qui sont très bien.Permettez-moi de vérifier ce point. On ne peut donc pas s'attendre à un
DATE
objet à renvoyer à partir d'une base de colonne, même si la colonne est de typeDATE
(selon les lignes commentées)?Aussi, si j'ai mis
new java.util.Date()
au lieu decRows.getDate("PREV_DATE")
l'erreur a disparu. Nous pouvons donc confirmer l'objet de retour n'est pasDATE
... droit?Si l'appel de
ResultSet.getDate("PREV_DATE")
fine,Timestamp ts = rs.getTimestamp("PREV_DATE")
devrait être possible, et je crois quers.getObject("PREV_DATE")
donne un Timestamp. Le coupable est CachedRowImpl.Vous pouvez remplacer
getDate
de CachedRowImpl et de faire le casting de java.util.Date.OriginalL'auteur Joop Eggen
J'ai fait une recherche sur cette question et a trouvé quelques liens utiles. J'ai trouvé cette confusion entre la DATE et l'HORODATAGE est Pilote JDBC spécifiques. Et la plupart des liens suggèrent l'utilisation de
-Doracle.jdbc.V8Compatible=true
. Pour ma JBoss j'ai mis cela dansrun.bat
et la question ai résolu.https://community.oracle.com/thread/68918?start=0&tstart=0
http://www.coderanch.com/t/90891/JBoss/oracle-jdbc-Compatible-true
L'oracle doc actions différentes solutions:
Modifier vos tables à l'utilisation d'HORODATAGE à la place de la DATE. C'est probablement
rarement possible, mais c'est la meilleure solution quand il est.
Modifier votre application pour utiliser defineColumnType pour définir les colonnes
en tant que TIMESTAMP plutôt que de DATE. Il y a des problèmes avec ce parce que
vous ne voulez vraiment pas à utiliser defineColumnType, sauf si vous avez (voir
Qu'est-ce que defineColumnType et quand dois-je utiliser? ).
Modifier votre application pour utiliser la méthode gettimestamp plutôt que getObject. Cette
c'est une bonne solution quand c'est possible, cependant, de nombreuses applications contiennent
code générique qui s'appuie sur la fonction getObject, de sorte qu'il n'est pas toujours possible.
Définir la V8Compatible propriété de la connexion. Cela dit les pilotes JDBC
pour utiliser l'ancienne cartographie plutôt que de le nouveau. Vous pouvez définir cet indicateur
soit comme une propriété de la connexion ou d'un système de propriété. Vous définissez la
propriété de la connexion en l'ajoutant à la java.util.Les propriétés de l'objet
passé à DriverManager.getConnection ou à
OracleDataSource.setConnectionProperties. Vous définissez le système de la propriété
en incluant une option-D dans votre ligne de commande java.
java -Doracle.jdbc.V8Compatible="true" MyApp
Voici le lien: http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-faq-090281.html#08_00
OriginalL'auteur NaaN