数ヶ月前に QueryDSL を使おうと思ったのですが、これが想像していたほど型安全ではなかったので採用を見送りました。何が安全ではないかというと、例えば User
と UserGroup
みたいなエンティティがあり、それぞれに name
という String
のプロパティを持っていたとすると、これが区別されない。QueryDSL が APT で生成するプロパティを見れば分かるんですが、こんな感じでプロパティがエンティティ型を持っていないのですね。
public final StringPath name = createString("name");
実際問題 User.name
と UserGroup.name
を厳密に区別して型安全に扱う必要性があるかというと、それが必要になるケースというのは稀だと思うので QueryDSL は意図的に割り切っているのかなという印象を持ちましたが、それまで自前で作成していた ORM では厳密に型を区別していたため、なんだかなぁと思って採用を止めたのでした(そういえば Doma がこのような型パラメータを採用したみたいですね)。
QueryDSL 使えば安全ですワイワイとか思っているとそうでもないというお話でした。
※ ちなみに自分ではこんな感じのライブラリを自作しました……。