Двойные имена полей в разных таблицах усложняют запрос `SELECT` в mybatis

У меня есть несколько таблиц, которые все имеют поле с именем 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 ответ

Решение

Как насчет

<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

Другие вопросы по тегам