2016-05-13 5 views
0

Ich versuche eine Funktionalität zu implementieren, wo ich eine Datenbank mit Eingabeparameterwerten abfragen muss. Eingabewerte sind optional.Wie man Selektionskriterien dyanisch in Java oder SQL hinzufügt

Zum Beispiel

Ich habe eine Tabelle Student mit folgenden Feldern

a) STUDENT_ID b) student_roll_no c) student_first_name d) student_last_name .. etc

Ich bin brauchen ein schreiben Dao-Layer-Funktion, um Student Details in Abhängigkeit von Eingabekriterien oder Parameter abrufen.

1), wenn nur Eingang enthält STUDENT_ID dann sollten Abfrage select * from Student sein, wo STUDENT_ID =:

2 inputStudentId), wenn Eingang STUDENT_ID enthält, vorName dann Abfrage select * from Student sein sollte, wo STUDENT_ID =: inputStudentId und first_name =: inputFirstName

wie weise für andere Eingabeparameter, beachten sie bitte Eingangsparameter 0 bis n Größe

sein

Bitte vorschlagen, was ist der beste Ansatz, es zu tun? Ich möchte keine Null-Checks hinzufügen und die Abfrage für Nicht-Null-Parameter anhängen. Ich will etwas sinnvoll und logisch entweder in Java oder SQL (benannte Abfrage)

ich java1.6 versuchen bin mit und überwintern

+1

Sie fragt, wie eine 'String' zu bauen? Wenn ja, verwenden Sie einen ['StringBuilder'] (https://docs.oracle.com/javase/6/docs/api/java/lang/StringBuilder.html). --- Für die beste Antwort sollten Sie zeigen, * wie * Ihre DAO-Methode die Eingabekriterien erhält und was Sie bisher versucht haben, z. B. den Code, den Sie haben. – Andreas

+0

Andreas Ich frage nicht, wie man einen String erstellt, ich werde diesen Wert in DAO funtion zum Beispiel hentStudentInfo (studentId, firstName, lastName ......) –

+0

Aber Ihre ganze Frage scheint um, wie man das SQL zu bauen Anweisung (ein 'String'), abhängig von Ihrer Eingabe. --- Auch nicht Code in einem Kommentar anzeigen, bearbeiten Sie die Frage. --- Was sind die Arten der Parameter? Wie erkennen Sie, ob ein Wert angegeben wurde oder nicht? --- Antworte nicht. Frage bearbeiten und klären – Andreas

Antwort

0

Wenn Sie Hibernate verwenden, können Sie HSQL verwenden zu tun, dass in folgender Weise:

query=em.createQuery("SELECT s FROM Student s WHERE s.id=:id"); 
query.setParameter("id",studentIt) 

für genaue API Informationen, lesen Sie in der Dokumentation @http://docs.jboss.org/hibernate/orm/5.1/userguide/html_single/Hibernate_User_Guide.html

Sie auch CriteraApi verwenden können - diese für die dynamische Erstellung der Abfrage gemacht wird.

+0

danke für die Antwort, aber wie ich bereits erwähnt habe, ich könnte StudentId als null, würde oben Code funktionieren? würde es die Studenten-ID nicht mit null vergleichen, wenn die Eingabe von studentId null ist? –

+0

Wenn Sie null PKs als etwas haben, ist nicht richtig ... Wie auch immer, Sie können immer versuchen, 'WHERE s.id =: ID oder ID IS NULL'. Aber nein, Null-Werte funktionieren in diesem Fall nicht, wobei die Klausel geändert werden muss. Verwenden Sie CriteriaAPI für das Erstellen solcher bedingter Abfragen. – Antoniossss

+0

Ich werde Daten in der Datenbank vollkommen in Ordnung haben. meine Frage war, ich könnte StudentID als Null in Eingabe-Parameter zum Beispiel hentStudentInfo (int studentID, Vorname ..).daher können meine Eingabeparameter null sein oder nicht. Wenn der Eingabeparameter NULL ist, würde die Abfrage als SELECT s gebildet werden FROM Student s WHERE s.id = null Ich möchte, dass, wenn ein Parameter null ist, dieser Parameter nicht verwendet werden soll, so wird die Abfrage SELECT s FROM Student s; oder gibt es eine Möglichkeit, ich kann mit SQL umgehen? –

0

Sie können dies tun, indem dynamisch etwas Ihren HQL mit optionalem Parameter Aufbau wie unten dargestellt:

Map<String, Object> parameters= new HashMap<String,Object>(); 
parameters.put("firstName", firstName); 
parameters.put("lastName", lastName); 


StringBuilder hql = "SELECT student FROM Student as student where 1 = 1"; 
if (firstName != null) { 
    hql.append(" and student.firstName in :firstName"); 
} 
if (lastName != null) { 
    hql.append(" and student.lastName in :lastName "); 
} 


Query query = session.createQuery(hql.toString()); 


for (String p : query.getNamedParameters()) { 
    query.setParameter(p, parameters.get(p)); 
} 
Verwandte Themen