-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 
Author Message
 Post subject: TimestampType.toString java.lang.ClassCastException
PostPosted: Fri Apr 21, 2006 5:12 am 
Newbie

Joined: Tue Apr 18, 2006 12:33 pm
Posts: 12
Hallo zusammen,

ich benutze Hibernate 3.2.0.CR1 mit Annotationen und ich bekomme
folgende Exception...

Code:
java.lang.ClassCastException
Stack Trace:

    * org.hibernate.type.TimestampType.toString(TimestampType.java:55)
    * org.hibernate.type.NullableType.nullSafeSet(NullableType.java:87)
    * org.hibernate.type.NullableType.nullSafeSet(NullableType.java:65)
    * org.hibernate.loader.Loader.bindPositionalParameters(Loader.java:1514)
    * org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1576)
    * org.hibernate.loader.Loader.doQuery(Loader.java:661)
    * org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:224)
    * org.hibernate.loader.Loader.doList(Loader.java:2145)
    * org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
    * org.hibernate.loader.Loader.list(Loader.java:2024)
    * org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:95)
    * org.hibernate.impl.SessionImpl.list(SessionImpl.java:1536)
    * org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
[...]

...wenn ich versuche, folgenden Code auszuführen:
Code:
[...]
Criteria criteria;

      if (criteriaMap.containsKey("personId")
            || criteriaMap.containsKey("gender")
            || criteriaMap.containsKey("date"))
      {
         Integer personId = null;
         Integer gender = null;
         String date = null;

         if (criteriaMap.containsKey("personId"))
         {
            personId = (Integer) criteriaMap.get("personId");
            criteriaMap.remove("personId");
         }

         if (criteriaMap.containsKey("gender"))
         {
            gender = (Integer) criteriaMap.get("gender");
            criteriaMap.remove("gender");
         }

         if (criteriaMap.containsKey("date"))
         {
            date = new SimpleDateFormat("yyyy-MM-dd").format(criteriaMap
                  .get("date"));
            criteriaMap.remove("date");
         }

         criteria = getSession().createCriteria(Finding.class).add(
               Restrictions.allEq(criteriaMap));

         if (date != null)
            criteria.add(Restrictions.like("date", date, MatchMode.START));

         if (personId != null)
            criteria.createCriteria("finder").add(
                  Restrictions.eq("id", personId));
[...]


Ist das ein Bug in Hibernate oder mache ich irgendetwas falsch?
Aber wie soll man sonst Timestamp-Attribute vergleichen (date ist vom Typ Timestamp)


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 21, 2006 7:23 am 
Beginner
Beginner

Joined: Thu Apr 21, 2005 5:37 am
Posts: 45
Location: Switzerland
Du solltest das Datum als Timestamp oder Date übergeben. Ich weiss allerdings nicht ob es eine "like"-Funktion für Daten gibt. Evtl. müsstest du Restrictions.gt() oder .lt() oder .eq() wechseln.

http://www.hibernate.org/hib_docs/v3/ap ... tions.html


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 21, 2006 9:34 am 
Newbie

Joined: Tue Apr 18, 2006 12:33 pm
Posts: 12
keule wrote:
Du solltest das Datum als Timestamp oder Date übergeben. Ich weiss allerdings nicht ob es eine "like"-Funktion für Daten gibt. Evtl. müsstest du Restrictions.gt() oder .lt() oder .eq() wechseln.

Danke für deine Antwort!

Kannst du zufällig den Code, der diese Umwandlung vornimmt, aus
dem Ärmel schütteln? ;)
Ich hab grad nämlich vergeblich versucht, aus der criteriaMap einen Timestamp bzw. ein Date Object zu bekommen...

criteriaMap.get("date") enthält Folgendes (ist direkt der Wert aus der Tapestry DatePicker Komponente)
Fri Apr 21 00:00:00 CEST 2006

Die Abfrage soll alle Datensätze von einem bestimmten Tag zurückgeben, d.h. es soll also nur der erste Teil des Datums für die Abfrage betrachtet werden. Wie würde man das machen, da komm ich doch um LIKE nicht drumherum, nachdem in der DB der gesamte Timestamp gespeichert ist, oder?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 21, 2006 9:56 am 
Beginner
Beginner

Joined: Thu Apr 21, 2005 5:37 am
Posts: 45
Location: Switzerland
Quote:
Die Abfrage soll alle Datensätze von einem bestimmten Tag zurückgeben, d.h. es soll also nur der erste Teil des Datums für die Abfrage betrachtet werden. Wie würde man das machen, da komm ich doch um LIKE nicht drumherum, nachdem in der DB der gesamte Timestamp gespeichert ist, oder?

Um das Datum aus dem String zu lesen brauchst du vermutlich ein java.text.DateFormat, siehe JavaDoc

Code:
DateFormat df= DateFormat.getDateInstance();
Date parsedDate= df.parse(dateString);
Calendar cal= Calendar.getInstance();
cal.setTime(parsedDate);
cal.set(Calendar.HOUR_OF_DAY, 0)//auch für min, sek und millis machen
Date date1=cal.getTime();
cal.add(Calendar.DAY_OF_MONTH, 1);
Date date2=cal.getTime();
[...]

criteria.add(Restrictions.ge("date", date1);
criteria.add(Restrictions.lt("date", date2);



1. Bastle dir zwei Date-Objekte, eines das die Uhrzeit 00:00:00 des bestimmten Tages hat und eines, mit derselben Uhrzeit ein Tag später.

2. Benutzer für die Restrictions ge (>=) mit dem 00:00-Date und lt (<) mit dem 23:59:59
[/code]


Top
 Profile  
 
 Post subject:
PostPosted: Fri Apr 21, 2006 10:37 am 
Newbie

Joined: Tue Apr 18, 2006 12:33 pm
Posts: 12
Mensch, super - vielen Dank! Das hat funktioniert!
Hast dafür auch zwei Credits bekommen *g


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 5 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.