単一のテーブルの場合には、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();