2016-06-03 24 views
0

Ich habe folgende abstrakte Klasse:Ist es möglich, Bindungen mit Anmerkungen zu verwenden?

public AbstractClass{ 
    public abstract String getCode(); 
} 

und die folgende konkrete Klasse:

public ConcreteClass extends AbstractClass{ 
    public String getCode(){ 
     return "EHY"; 
    } 
} 

Nun, würde ich für die Ausgabe dieser Klasse wie ein Parameter für eine Mybatis Abfrage zu sein:

@Select(value="select* from Table where code= #{what here?}" 
public List<Something> getFromTable(ConcreteClass param); 

ist es möglich? Ich weiß, dass Mybatis erlaubt die Ausgabe eines Verfahrens zu einer Variablen durch die bind Anmerkung zu binden:

<select id="selectBlogsLike" resultType="Blog"> 
    <bind name="pattern" value="'%' + _parameter.getTitle() + '%'" /> 
    SELECT * FROM BLOG 
    WHERE title LIKE #{pattern} 
</select> 

aber hier bin ich mit Anmerkungen und ich kann keine @Bind ein ...

+0

Haben Sie '# {param.getTitle()}' (oder '# {param.title}' versucht, da EL im Allgemeinen Eigenschaften unterstützt)? – chrylis

+0

haben Sie versuchen, # {Code}? – andy

+0

In diesem interessanten Link https://spring.io/blog/2014/07/15/spel-support-in-spring-data-jpa-query-definitions sagten sie, dass Sie mit Hilfe von SpEL so etwas wie '': # {# param.code} ' – RubioRic

Antwort

1

finden Versuchen Sie #{param.getTitle()} oder Sie können Ihren eigenen SQL Builder erstellen.

@SelectProvider(type = UserSqlBuilder.class, method = "buildGetUsersByName") 
List<User> getUsersByName(String name); 

class UserSqlBuilder { 
    public String buildGetUsersByName(final String name) { 
    return new SQL(){{ 
     SELECT("*"); 
     FROM("users"); 
     if (name != null) { 
     WHERE("name like #{value} || '%'"); 
     } 
     ORDER_BY("id"); 
    }}.toString(); 
    } 
} 

Wenn Sie mehrere Parameter haben, können Sie wie folgt definieren.