2012-08-14 6 views
6

Mam SQL napisany w pliku odwzorowujący MyBatis który jest mniej więcej tak:dostępu public static final ciąg w mybatis sql w plikach Mapper

<select id="somesql"> 
    select a,b,c from tbl_name where d = ? 
</select> 

Wartość zastępczy d ma być stałe zadeklarowane plik o nazwie Constants.java jak:

public static final String d = "d_value"; 

Jak wymienić element zastępczy z wartością bez faktycznie przechodzącą parametr w <select> konstruktem? Próbowałem #{com.pkg.name.Constants.d}, ale to nie zadziałało.

Bez twardego kodowania !!!

Odpowiedz

2

Po wyjęciu z pudełka zachowania MyBatis, o ile wiem, nie można.

Można spróbować napisać interceptor for the ParameterHandler i wstrzyknąć tam wartość, ale to nie zawsze może być możliwe, ponieważ można grać tylko z dwóch metod dotyczących obsługi parametrów:

  • getParameterObject która zwraca parametr, który był wysłane do zapytania (może być stałą, ciągiem znaków, mapą, obiektem niestandardowym, a nawet wartością null, tak jak w przypadku twojego przykładu, w którym nie wysyłasz parametru)
  • setParameters gdzie, jak sądzę, możesz spróbować ustaw parametr, jeśli wiesz, gdzie znajduje się na przygotowanym wyciągu (który większość razy może nie być).

Moja sugestia to przekazanie go jako parametru do zapytania. Funkcje przechwytujące MyBatis nie są dobrze udokumentowane, więc możesz od razu uzyskać prawidłową kombinację roboczą i możesz mieć więcej problemów niż jest to warte.

3
<select id="getConvenienceStoreList" resultType ="Store"> 
    SELECT * FROM Store 
    WHERE type = ${@[email protected]_STORE} 
    ORDER BY id 
    LIMIT #{start}, #{limit} 
</select> 

referencyjny: http://qiita.com/ApplePedlar/items/12dc389cc32f3db5557a

+0

Właściwie to działa !! Pamiętaj jednak, że wartość jest wklejana "tak jak jest", bez ucieczki, bez cudzysłowów. Więc jeśli nie używasz go do liczb, musisz przynajmniej dodać cytaty. –

+0

Właściwie to zamieniamy wszelkie parametry przekazane na mappers, poza faktem, że nie używamy tylko stałych STATYSTYCZNYCH, ale można również wywołać metodę statyczną, jak poniżej: ${@foo.product.constant.StoreType @getWhereClausule()} – kensai

Powiązane problemy