Двойные имена полей в разных таблицах усложняют запрос `SELECT` в mybatis - PullRequest
1 голос
/ 15 августа 2011

У меня есть несколько таблиц, у всех из которых есть поле с именем created_at, это временная метка для представления при вставке строки.

Теперь я использую mybatis 3 в качестве слоя персистентности, мне было немного скучно, когда я что-то запрашиваю с join.

Посмотрите на простой SQL, я ожидал получить все вопросы и ответы на них:

<select id="selectQuestionsWithAnswers">
      select q.*, a.* from questions as q left inner join answers as a
             on q.id=a.id
      order by a.created_at desc
</select>

Но я обнаружил, что как questions, так и answers оба имеют поле created_at, и если я напишу select q.*, a.*, в наборе результатов будет 2 created_at, а второе игнорируется. Таким образом, ответы будут иметь значение created_at как questions, это не правильно.

Чтобы избежать этого, я нашел 2 способа, но оба не хороши:

  1. Измените имена полей каждой таблицы, убедитесь, что они не совпадают. Например: questions.created_at -> questions.q_created_at, answers.created_at -> answers.a_created_at.

    Это нехорошо, поскольку таких полей много, как id, name, title, updated_at, что затрудняет чтение и ведение базы данных для изменения этих имен

  2. Изменить SQL . Измените имена полей в sql, например:

    select q.id as q_id, q.title as q_title, ..., q.created_at as q_created_at, 
           a.id as a_id, a.content as a_content, ..., a.created_at as a_created_at
    from questions as q left inner join answers as a
           on q.id=a.id
    order by a.created_at desc
    

    Это нехорошо, потому что мне нужно менять каждое имя поля в SQL, оно становится очень длинным и трудным для чтения, и каждый раз больно писать такие SQL.

Я новичок в mybatis, есть ли лучшее решение для этой проблемы?

1 Ответ

2 голосов
/ 15 августа 2011

А как же

<select id="selectQuestionsWithAnswers">
      select q.*, a.*, q.created_at as qtime, a.created_at as atime from questions as q left inner join answers as a
             on q.id=a.id
      order by atime desc
</select>

теперь у вас будет время в atime и qtime

...