Frage JDBI verwendet @bind für Variablen in Abfragen in Anführungszeichen


Ich frage mich, ob und wie das möglich ist, wenn es so ist, ich bin mir sicher, dass es eine einfache Lösung ist, die ich scheinbar nicht herausfinden kann

@SqlQuery("SELECT * FROM Table WHERE column LIKE '%:thingName%'")
public Set<Things> getThings(@Bind("thingName", String thingName)

Im Wesentlichen versuche ich für dieses Spielzeugbeispiel eine Zeile auszuwählen, in der eine Spalte [irgendeinen Text] enthält dingName [anyText]. Bei der Verwendung wie oben denke ich, dass die Anführungszeichen die gebundene Variable verdunkeln, so dass sie buchstäblich nach einem beliebigen Text sucht.: SacheName[anyText] und nicht meine gebundene Variable.

Vielen Dank im Voraus, Madeline


12
2018-05-31 21:08


Ursprung


Antworten:


Es scheint so zu sein, dass Sie die '%' Prozentsätze zu der gebundenen Variable hinzufügen müssen:

@SqlQuery("SELECT * FROM Table WHERE column LIKE :thingName")
public Set<Things> getThings(@Bind("thingName") String thingName); // where thingName = "%" + thingName + "%"

Siehe auch: https://groups.google.com/forum/?fromgroups#!topic/jdbi/EwUi2jAEPdk

Zitat von Brian McCallister

Die Verwendung des: foo-Bindungstasks erstellt eine vorbereitete Anweisung und bindet in diesem Fall den Wert für name ein. Sie benötigen%, um Teil des gebundenen Werts zu sein, oder Sie müssen keine Bindungen zu einer vorbereiteten Anweisung verwenden.

  • Ansatz 1 (der sicherere und meist bessere):   "select ... from foo wo name wie: name" und bind den Wert ("%" + name)

  • Approach 2 (öffnet Sie bis zur Injektion):

"select ... from foo wo name wie '%'" und definiere ("name", name) (oder in sql object, (@Define ("name") name) - was den Namen als Literal in deine Aussage einfügt.

Der Schlüssel ist, dass das% -Zeichen Teil des Wert Sie testen gegen, nicht Teil der Aussage.


10
2018-05-31 21:37



Ich verwende concat, um die Eingabe mit% -Zeichen zu umgeben, während ich gleichzeitig eine gebundene Variable verwende, um SQL-Injection zu vermeiden:

@SqlQuery("select * from atable where acolumn like concat('%',:thingName,'%')")
public Set getNames(@Bind("thingName") String thingName);

16
2017-07-20 07:56