0
ich eine Tabelle mit folgenden Daten haben
ee2=> select * from emp;
id | name
----+---------------
1 | Hemant
2 | Hem-Awesome
3 | John A
4 | John B
5 | Hem-Awesome 2
6 | Hem-Awesome 3
7 | Hem-Awesome 4
(7 rows)
Und die corressponding POJO als
public class Employee {
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Die Aufgabe Benutzer mit Namen zu finden war die gegebene passende Muster und ID größer als ein Wert
Diese Abfrage erreicht das gewünschte Ergebnis:
@Select("SELECT id, name from emp where name ilike '%${filter}%' and id > #{id}")
public List<Employee> listEmpByName(@Param("filter")String filter, @Param("id") int id);
17:28:40.742 [main] DEBUG c.e.d.m.FeedbackMapper.listEmpByName - ooo Using Connection [[email protected]]
17:28:40.753 [main] DEBUG c.e.d.m.FeedbackMapper.listEmpByName - ==> Preparing: SELECT id, name from emp where name ilike '%hem%' and id > ?
17:28:40.801 [main] DEBUG c.e.d.m.FeedbackMapper.listEmpByName - ==> Parameters: 2(Integer)
17:28:40.836 [main] DEBUG c.e.d.m.FeedbackMapper.listEmpByName - <== Total: 3
[Employee [id=5, name=Hem-Awesome 2], Employee [id=6, name=Hem-Awesome 3], Employee [id=7, name=Hem-Awesome 4]]
Die String-Substitution schlägt jedoch fehl, wenn ich stattdessen selectProvider verwende.
@SelectProvider(type = com.hem.MapperSQLBuilder.class, method = "listEmpByNameProvider")
public List<Employee> listEmpByNameProvider(@Param("filter")String filter, @Param("id") int id);
Verfahren in ausgewählten Anbieter ist wie folgt:
Substitution funktioniert gut (# {}) aber String-Substitution ($ {})public String listEmpByNameProvider(Map<String, Object> parameters) {
System.out.println(parameters);
return "SELECT id, name from emp where name ilike '%${filter}%' and id > #{id}";
}
Aber mit selectProvider, Parameter
17:35:40.146 [main] DEBUG o.a.i.t.jdbc.JdbcTransaction - Opening JDBC Connection 17:35:40.202 [main] DEBUG o.a.i.t.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [[email protected]] 17:35:40.204 [main] DEBUG c.e.d.m.F.listEmpByNameProvider - ooo Using Connection [[email protected]] 17:35:40.215 [main] DEBUG c.e.d.m.F.listEmpByNameProvider - ==> Preparing: SELECT id, name from emp where name ilike '%${filter}%' and id > ? 17:35:40.293 [main] DEBUG c.e.d.m.F.listEmpByNameProvider - ==> Parameters: 2(Integer) 17:35:40.338 [main] DEBUG c.e.d.m.F.listEmpByNameProvider - <== Total: 0 []
kann jemand die Bohnen verschütten, warum dies passieren könnte?
' "SELECT id, name von emp where name like '% "+ $ {Filter} +" %' und id> # {id}";' Hast du das versucht? –
Das funktioniert gut ... aber ich war mehr interessiert zu wissen, warum Substitution fehlschlägt – hemantvsn
Sie müssen den Wert mit den singlequotes und% Symbol für wie verketten! Das haben wir hier gemacht. Ich werde es als Antwort hinzufügen. –