GAE/Jでタグ

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の方がいいかも