Aipoでレコードを取得する方法

単一のテーブルの場合には、Operationsを使って簡単に取得することが出来る。

List<EipTMessageRoomMember> roomMembers =
        Database
          .query(EipTMessageRoomMember.class)
          .where(
            Operations.eq(EipTMessageRoomMember.LOGIN_NAME_PROPERTY, username))
          .fetchList();

in句で取得したいときには、次のようにする。リレーションの設定してあるカラムは、IDではなくエンティティクラスのリストを渡している点に注意

      SelectQuery<EipTBlog> EipBlogSQL =
        Database.query(EipTBlog.class).where(
          Operations.in(EipTBlog.OWNER_ID_PROPERTY, userId));
      List<EipTBlog> EipBlogList = EipBlogSQL.fetchList();

      if (EipBlogList != null && EipBlogList.size() > 0) {
        List<EipTBlogEntry> EipTBlogEntryList =
          Database
            .query(EipTBlogEntry.class)
            .where(Operations.in(EipTBlogEntry.EIP_TBLOG_PROPERTY, EipBlogList))
            .fetchList();
      }

JOINしたレコードを取得したい場合には、次のようにSQL文を書くようにする。MySQLとPostgreSQLのどちらでも動くように注意。

String query="select t2.room_id,  t2.name,  t2.has_photo,  t2.photo_modified,  t4.user_id,  t4.last_name,  t4.first_name,  t4.has_photo as user_has_photo,  t4.photo_modified as user_photo_modified,  t2.auto_name,  t2.room_type,  t2.last_message,  last_update_date,  (select count(*) from eip_t_message_read t3 where t3.room_id = t2.room_id and t3.user_id = #bind($user_id) and t3.is_read ='F') as unread   from eip_t_message_room_member t1, eip_t_message_room t2, turbine_user t4 where t1.user_id = #bind($user_id) and t1.room_id = t2.room_id and t1.target_user_id = t4.user_id  order by t2.last_update_date desc  LIMIT 20";
List<DataRow> fetchList =
      Database.sql(
        EipTMessageRoom.class,
        query).param(
        "user_id",
        Integer.valueOf(user_id)).fetchListAsDataRow();