Java und PostgreSQL

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

ich lasse gerade Findbugs über einen Code von mir drüberlaufen und habe bei folgendem Code ein kleines Problem:

Java:
String query = "SELECT \"type\" FROM \"reservednames\" WHERE (\"match_firstname\" = TRUE AND ? ~ \"pattern\") OR (\"match_both_names\" = TRUE and ? ~ \"pattern\") ";
     if (!lastName.equals(""))
     {
       query = query + " OR (\"match_lastname\" = TRUE and ? ~ \"pattern\")  ";
     }
     
     PreparedStatement ps = databaseConnection.preparedStatement(query);
     ps.setString(1, firstName);
     ps.setString(2, combinedName);
     if (!lastName.equals(""))
     {
       ps.setString(3, lastName);
     }

Fehlermeldung
Code:
A prepared statement is generated from a nonconstant String

Der Fehler wird in dieser Zeile angezeigt:

Code:
PreparedStatement ps = databaseConnection.preparedStatement(query);

Daraus schliesse ich, das der Query irgendwo nicht 100% sicher ist, leider sehe ich nicht wo.

Den Query habe ich nach einem Buch und Tutorials zusammengeschraubt.

KAnn mir wer von euch nen Tip geben?

mfg
Chris
 

sheel

I love Asm
Hi

so auf den ersten Blick seh ich da keine Fehler (vorausgesetzt, diese "pattern"-Wörter,
die wohl im echten Code Pattern sind, enthalten keine Probleme).

Alle mir bekannten statischen Analysetools liefern ab und zu auch Falschmeldungen...
Findbugs könnte sich zB. daran stören, dass die Query mit + zusammengesetzt wird,
abhängig von einer Variable, und bei sowas sofort die Meldung ausgeben.
Was ist denn, wenn du testweise beide if-Blöcke entfernst und query static final machst?
Wenn die Meldung dadurch verschwindet ist sie eindeutig falsch gewesen.
 

nchristoph

Erfahrenes Mitglied
Hab das gemacht was du gesagt hast. Die Fehlermeldung ist weg.

Hier der gesamte Code der Funktion
Java:
private String checkForReservedName(String firstName, String lastName) throws SQLException
   {
     firstName = firstName.toLowerCase();
     lastName = lastName.toLowerCase();
     
     firstName = firstName.replaceAll("'", "");
     firstName = firstName.replaceAll("-", "");
     lastName = lastName.replaceAll("'", "");
     lastName = lastName.replaceAll("-", "");
     
     String combinedName = firstName + " " + lastName;
     combinedName = combinedName.replaceAll("\\s*$", "");
     
     String query = "SELECT \"type\" FROM \"reservednames\" WHERE (\"match_firstname\" = TRUE AND ? ~ \"pattern\") OR (\"match_both_names\" = TRUE and ? ~ \"pattern\") ";
     if (!lastName.equals(""))
     {
       query = query + " OR (\"match_lastname\" = TRUE and ? ~ \"pattern\")  ";
     }
     
     PreparedStatement ps = databaseConnection.preparedStatement(query);
     ps.setString(1, firstName);
     ps.setString(2, combinedName);
     if (!lastName.equals(""))
     {
       ps.setString(3, lastName);
     }
     
     ResultSet resultSet = ps.executeQuery();
     
     if (resultSet.next())
     {
       
       return resultSet.getString("type");
       
     }
     resultSet.close();
     return null;
   }

Welche anderen ausser Findbugs gibt es noch?