3

my problem is a bit similar to this: I want to retrieve rows whose date doesn't has more than 20 minutes compared with the current date time, my source code:

   EntityManagerFactory emf=Persistence.createEntityManagerFactory("JavaApplication21PU");
   CoordonneesJpaController cjc=new CoordonneesJpaController(emf);
   Timestamp nd=new Timestamp(System.currentTimeMillis());//now
   nd.setMinutes(nd.getMinutes()-20);

   EntityManager em = getEntityManager();
   Query qr= em.createQuery("SELECT c FROM Coordonnees c WHERE c.date > '"+nd+"'");
    java.util.List<Coordonnees> lC=qr.getResultList();  

My entity:

    public class Coordonnees implements Serializable {
    //some code...
    @Basic(optional = false)
    @Column(name = "DATE", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

when I run this code:

Exception in thread "main" Local Exception Stack: 
Exception [EclipseLink-3002] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.ConversionException
Exception Description: The object [%2012-04-06 16:19:49.179%], of class [class java.lang.String], from mapping [org.eclipse.persistence.mappings.DirectToFieldMapping[date-->APIGPS.PUBLIC.COORDONNEES.DATE]] with descriptor [RelationalDescriptor(javaapplication21.Coordonnees --> [DatabaseTable(APIGPS.PUBLIC.COORDONNEES)])], could not be converted to [class java.sql.Timestamp].
    at org.eclipse.persistence.exceptions.ConversionException.incorrectTimestampFormat(ConversionException.java:119)
    at org.eclipse.persistence.internal.helper.Helper.timestampFromString(Helper.java:1888)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToTimestamp(ConversionManager.java:726)
    at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:107)

the error is from this line:

   Query qr= em.createQuery("SELECT c FROM Coordonnees c WHERE c.date > '"+nd+"'")

Any helps ?

Community
  • 1
  • 1
Marwen Trabelsi
  • 4,167
  • 8
  • 39
  • 80

1 Answers1

5

It looks like you are comparing c.date which is a Date (Timestamp) with a String, as you are setting the nd in the string query, and surrounded by single quotes. You should use a named parameter, and set the nd variable into that parameter.

Query qr= em.createQuery("SELECT c FROM Coordonnees c WHERE c.date > :nd");
qr.setParameter("nd", nd);
Luciano
  • 8,552
  • 5
  • 32
  • 56