Google App Engine Javaでタグのようなデータを実現するには、どのようにデータを保存すればいいのか考えていたのだが、考える必要もないほど簡単だった。タグの文字列を一つずつ普通にList型に値を入れて保存するだけでいいらしい。
以下のようなエンティティクラスを作って、タグはList型に入れる。
@PersistenceCapable(identityType=IdentityType.APPLICATION) public class Hoge { @PrimaryKey @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY) private Key key; @Persistent private User user; @Persistent private List<String> tags; // 以下略 }
特定のタグを持つデータの検索は
PersistenceManager pm = .... Query query = pm.newQuery(Hoge.class); query.setFilter("user == pUser"); query.setFilter("tags.contains(pTags)"); query.declareParameters(user.getClass().getName() + " pUser ," + List.class.getName() + " pTags"); List<Hoge> hoges = (List<Hoge>)query.execute(user, "hoge");
とするだけで リストの要素にhogeという文字列を含むエンティティを取得できるようだ。JDOの仕様なのかGAE独自の機能なのか調べてないが、いずれにしてもすげー楽。
"tags.contains(pTags)"
は
"tags == pTags"
でも良いようだ。
ついき
Listよりも重複しないようにSetの方がいいかも