2017-07-26 6 views
0

Hallo im Hibernate versucht, basierend auf der Anzahl der Datensätze aus der Tabelle mit auf Start- und Enddatum, aber im nicht einen gültigen Monat Fehler Erstenkein gültiger Monat in Hibernate

Session session = sessionFactory.getCurrentSession();   
startDate = "13-02-02 00:00:00"; 
endDate = "17-02-02 00:00:00"; 
try{ 
    String hql = "select Count(*) from mytable where PERIOD_START_DATETIME between '" 
       + startDate + "' AND '" + endDate + "'"; 
    Query query = session.createQuery(hql); 
    long count=(long) query.uniqueResult(); 

    return count; 
} finally{ 
    session.close(); 
} 

Dies ist meine Tabellenbeschreibung

 
Name     NULL  TYPE 
NAME     NOT NULL VARCHAR2(255 CHAR) 
PERIOD_END_DATETIME  NOT NULL TIMESTAMP(6)   
PERIOD_START_DATETIME NOT NULL TIMESTAMP(6)   
PROD_OFFER_TERM_TYPE_ID NOT NULL NUMBER(19) 
+0

Überprüfen Sie das Datumsformat verwendet. Wenn es das amerikanische M-D-Y-Format ist, dann sind 13 und 17 keine gültigen Monate. – Thomas

+3

Anstatt die Variablen in die Abfrage zu verketten, verwenden Sie Bind-Variablen und übergeben Sie die tatsächlichen Java-Daten, nicht ihre String-Repräsentationen. –

+0

@Thomas es ist YY-MM-DD mm: hh: ss – Wayne

Antwort

2

Da die Start-/Endzeiten sind SQL TIMESTAMP s in der DB, können Sie in einem Timestamp Objekt in die Abfrage übergeben, wie folgt:

Session session = sessionFactory.getCurrentSession(); 

final DateFormat df = new SimpleDateFormat("yy-MM-dd"); 

// omitting the time part will set the time to midnight (00:00:00) 
Timestamp start = new Timestamp(df.parse("13-02-02").getTime()); 
Timestamp end = new Timestamp(df.parse("17-02-02").getTime()); 

try { 
    String hql = 
     "select Count(*) from mytable where PERIOD_START_DATETIME between ? AND ?"; 
    Query query = session.createQuery(hql) 
      .setTimestamp(0, start) 
      .setTimestamp(1, end); 

    long count = (long) query.uniqueResult(); 

    return count; 
} finally { 
    session.close(); 
} 
+0

funktioniert das, wenn ich zur Laufzeit auch den Tabellennamen übergeben muss – Wayne

+0

Sie kennen also den Namen der Kompilierzeit der Tabelle nicht? –

+0

@Wayne Wenn Sie mit Hibernate arbeiten, sollten Sie in Tabellennamen nicht denken. Übergeben Sie einen _entity_-Namen (den Namen der Klasse oder einen Alias). Und da Sie die Abfrage sowieso konstruieren, was lässt Sie denken, dass das nicht funktionieren würde? – Thomas

1

Stellen Sie sicher, dass Sie tatsächlich Datumswerte in Ihrer Abfrage übergeben. Sie können die to_date-Funktion verwenden, in der Sie das Format des Datums angeben, wie es in der Zeichenfolge dargestellt wird.

select Count(*) 
from mytable 
where PERIOD_START_DATETIME between to_date(startDate,'DD-MM-YYYY HH24:MI:SS') AND to_date(endDate,'DD-MM-YYYY HH24:MI:SS'); 
+0

Wie sollte ich es in Hibernate tun – Wayne

+0

Genau wie Sie in Ihrem Beispiel getan haben. Fügen Sie in der Abfrage, die Sie erstellen, die Funktion "Bis" hinzu. – Rene

3

Mit String-Verkettung von SQL-Abfragen zur Erzeugung ist in der Regel eine schlechte Idee, weil

  • es ist schlecht für die Leistung (Ursachen erneut Parsing der SQL-Anweisung für jede Ausführung)
  • es anfällig ist, zu SQL Injection-Angriffe

HQL unterstützt bind-Variablen/Prepared Statements, so sollte diese Arbeit:

String hql = "select Count(*) from mytable where PERIOD_START_DATETIME between :startdate AND :enddate "; 
Query query = session.createQuery(hql); 
query.setParameter("startdate", startDate); 
query.setParameter("enddate", endDate); 

(wobei startDate und endDate sind tatsächliche java.sql.Timestamp Werte, keine Zeichenfolgen).

+0

Datumswerte funktionieren nicht, da ich das Datum in Db als TimeStamp gespeichert habe, das verschiedene Formate auf der Grundlage der Sprache verwendet. – Wayne

+0

Ich muss einen formatierten String übergeben – Wayne

+1

Die Datenbank * speichert * Timestamps nicht in verschiedenen Formaten basierend auf Sprache - die einzigen Zeitformate kommen ins Spiel, wenn Sie * Ihren * Zeitstempel zu/von einer Zeichenfolge konvertieren. –

0
select Count(*) 
from mytable 
where PERIOD_START_DATETIME between TO_TIMESTAMP(:startDate, 'YY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP(:endDate, 'YY-MM-DD HH24:MI:SS') 
Verwandte Themen