クロージャ(FCM)とジェネリックスを組み合わせると、完全にタイプセーフな基準を持つことが可能になります。
// The following works without a cast as Foo.id is a 'long' field.
List<Long> ids = session.createCriteria(Foo.class)
.setProjection(Foo#id)
.list();
// The following is a compilation error, as Foo.bar is defined as an int, and not a string
session.createCriteria(Foo.class)
.addRestriction(Restrictions.eq(Foo#bar,"blah"))
.list();
タイプセーフ基準については、JPA2.0仕様を読みました。しかし、それでもやや不足しています。
また、ここでは、一般的なコードの型安全性を向上させる例として、基準を使用しています。コーディングを高速化するために、Javaの静的型付けを多用しました。しかし、その結果、タイピングを無視するコードの部分に時々噛まれます。たとえば、HQLクエリ。