Когда MyBatis передает несколько параметров, как определить, существует ли атрибут параметра или нет? - PullRequest
0 голосов
/ 18 июня 2019

Когда я использую Mybatis, интерфейс DAO указывает, что передаваемый параметр называется «param», то есть POJO с двумя атрибутами внутри. Теперь мне нужно сделать разные запросы, основанные на существовании этих двух атрибутов. Я не знаю, как это сделать.

Я знаю, что следует использовать динамический SQL, но я могу только судить, существует ли POJO, а не существуют ли его свойства, в противном случае MyBatis подскажет мне, что не может найти это свойство.

/ Это интерфейс DAO, который определяет имя параметра. / общедоступный список findByPage (@Param ("param") T o, Page page);

/ Это соответствующий ему файл Mapper, я могу только судить, существует ли один атрибут, но не существует ли другой атрибут. /

SELECT * FROM ps_jzg j, ps_bm b j.BM_DM = b.DM AND j.BM_DM = # {param.bmDm}

Теперь этот параметр с именем "param" имеет два атрибута: bmDm и processid. Мне нужно определить, существуют ли эти два параметра, а затем сделать разные запросы. Теперь я могу только судить, существует ли «парам» POJO. Я не могу изменить интерфейс DAO, потому что он прописан верхним уровнем. Это беспокоило меня долгое время. Мне действительно нужна твоя помощь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Большое спасибо. Я нашел решение проблемы:

<select id="findByPage" resultMap="base"  parameterType="PsJzgXx">
    SELECT * FROM ps_jzg j,ps_bm b
    <where>
        j.BM_DM = b.DM
        <if test="param != null and param !='' ">
            <if test="param.bmDm != null and param.bmDm !='' ">
                AND j.BM_DM = #{param.bmDm}
            </if>
           <if test="param.processid != null and param.processid  !='' ">
                AND j.processid  = #{param.processid }
           </if>
        </if>
</where>
</select>

Но если я напишу это следующим образом, компилятор выдаст исключение , Потому что он не знает, чтобы найти параметр "bmDm":

<select id="findByPage" resultMap="base"  parameterType="PsJzgXx">
    SELECT * FROM ps_jzg j,ps_bm b
    <where>
        j.BM_DM = b.DM
        <if test="param.bmDm != null and param.bmDm !='' ">
            AND j.BM_DM = #{param.bmDm}
        </if>
        <if test="param.processid != null and param.processid  !='' ">
            AND j.processid  = #{param.processid }
        </if>
        </if>
    </where>
</select>
0 голосов
/ 18 июня 2019

Ваш T общий параметр?Если нет, попробуйте это в своем XML-файле.

<select id="findByPage" parameterType="com.xx.xx.xx.T">
        select * from  ps_jzg j,ps_bm b
        where j.BM_DM = b.DM 
        <if test = 'bmDm != null'> 
            AND j.BM_DM = #{bmDm}
        </if>
        <if test = 'processid != null'>
            and j.processid = #{processid}
        </if>
</select>

Тем временем удалите аннотацию @Param из вашего интерфейса.

...