2011-08-15 11 views
1

すべてのテーブルには、created_atという名前のフィールドがあります。これは、その行が挿入されたときを表すタイムスタンプです。異なるテーブル内の重複するフィールド名は、mybatisで複雑な `SELECT`クエリを作成します。

私は永続性レイヤーとしてmybatis 3を使用しましたが、私はjoinで何かを照会するとちょっと退屈でした。

<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> 

しかしquestionsanswers両方がフィールドcreated_atを持っている、と私はselect q.*, a.*を書いた場合、2 created_atがあるので、私は、見つかった:私はすべての質問とその回答を得ることが期待単純なSQLで

ルック結果セットでは、2番目のものは無視されます。したがって、答えはcreated_atの値がquestionsとなり、正しくありません。これを避けるために

は、私は2つの方法を見つけましたが、両方の良いではない:

  1. 各テーブルのフィールド名を変更し、彼らは同じではありませんことを確認してください。例:questions.created_at - >questions.q_created_at,answers.created_at - >answers.a_created_atidnametitleupdated_atなどの分野が多いため

    これは良いではない、それはハードデータベースが読み取りおよびSQLを変更し、これらの名前

  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のフィールド名を変更します。

私はmybatisを使いましたが、この問題の解決策はありますか?

答えて

2

<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> 

についてどのような今、あなたはあなたのSQLは私よりはるかに優れてatimeqtime

+0

であなたの時間を持っています。しかし、私が見つけたのは、 'id'、' user_id'、 'update_at'などの名前が重複しています。 – Freewind

+0

誰か他の人がよく答えない限り、このリンクは参考になるでしょう。http://www.bar54.de/projekte/ ibator-extensions/ibator-sqlmap-column.html – kurochenko

+0

私はそのプラグインではあまり明確ではありません。地図ファイルに 'ibator'でsqlsを生成するときにのみ役に立ちますか?私が手書きでsqlsを書くと、それは役に立ちません。 – Freewind

関連する問題