2016-08-09 64 views
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?

+0

' "SELECT id, name von emp where name like '% "+ $ {Filter} +" %' und id> # {id}";' Hast du das versucht? –

+0

Das funktioniert gut ... aber ich war mehr interessiert zu wissen, warum Substitution fehlschlägt – hemantvsn

+0

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. –

Antwort

0

Concatenate der Wert wie folgt:

SELECT id, name from emp where name like '%"+${filter}+"%' and id > #{id}.