0

クロージャ(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クエリ。

4

2 に答える 2

2

あなたが記述しているコードは、クロージャではなくフィールド リテラル(メソッド リテラル) を使用しています。古き良きクラスリテラルのように。これらは基準 API で役立つ可能性があります。タイプ セーフなクエリ インターフェイスのJPA 2 ソース コード生成の回避策は、それに置き換えることができます。それがJDK7の一部になる場合。

于 2009-11-20T22:34:47.113 に答える
1

Thomas が指摘しているように、これは厳密には閉鎖を必要としません。どのような提案が検討されているかは誰にもわからないため、現時点ではすべてが宙に浮いています。FCM が実際に提案の基礎であるかどうかは明らかではありません。特に、Stephen Colebourne が発表について誰よりも驚いているように見えることを考えると.

多くの人が、クロージャーがどのような形になるかについてのヒントとして、ニール・ガフターの不思議なほど修正された多かれ少なかれ正しい、Devoxx プレゼンテーション発表クロージャーが与えられた仕様を指摘しています。修正された提案は (美的に) FCM のように見えます。

その仕様には、参照する種類の参照が含まれています (上記の行の「メソッド参照」の下)。もちろん、FCM にも同じものがあります。はい、これは間違いなく提案を可能にします。これについて読んだときの私の最初の考えは、この点に関して、JPA / Hibernate、および/または私たち自身の抽象化レイヤーにどのように影響するかということでした。基準でタイプセーフでリファクタリング可能なメソッド参照はありますか? ええ。

于 2009-11-21T05:36:07.573 に答える