1

リストに格納されているエンティティに関連付けられたIDのリストがあるとします。JPQLでINキーワードを使用する場合にこのリストを関数に渡すと、想定している通常のクエリ言語で使用するのと同じ機能が得られるはずです...

しかし、コードを実行しようとすると、その例外が発生します...私のコードは次のようになります...

public void UpdateEntityByPerson(int ID, int[] EntityIDs) {
    // TODO Auto-generated method stub
    List<EntityList> distList = null;//new ArrayList<EntityList>();
    try{        
        Provider prov = emf.find(Provider.class, new Long(ID));
        prov.setDistListPermCollection(null);
        distList = emf.createNamedQuery("getEntityListByListIds").setParameter("listIds", EntityIDs).getResultList();
        prov.setEntityListPermCollection(distList);         
    }
    catch(Exception ex){
        System.out.println("Exception : "+ex);
        ex.printStackTrace();
    }
}

これが私のJPQLという名前のクエリです...

@NamedQuery(name="getEntityistByListIds", query = "SELECT d FROM EntityList d WHERE d.listId in :listIds"),

ここで何が間違っているのでしょうか?私が考えた1つのことは、整数の配列があるということです... EntityIDは実際には長いです...それはわずかなbrew-ha-haを引き起こしている可能性があります!

4

1 に答える 1

1

EntityListのlistId属性のタイプが長い場合、INへのパラメーターのタイプは単一Longまたはlong値またはである必要がありますList<Long>。したがって、次の種類の引数に適用できます。

List<Long> EntityIDs = Arrays.asList(new Long[]{1L, 2L});
Long EntityIDs = 0;
long EntityIDs = 0;

仕様では、これは次のように、より一般的な形式で綴られています。

リテラルおよび/または入力パラメータ値は、typeのstate_field_path_expressionと同じ抽象スキーマタイプのようである必要があります。

同様のタイプの値のみを比較できます。タイプが同じJava言語タイプに対応する場合、または一方がプリミティブJava言語タイプであり、もう一方が同等のラッパー化されたJavaクラスタイプである場合(たとえば、intとIntegerはこの意味でタイプに似ています)、タイプは別のタイプに似ています。この規則には1つの例外があります。それは、数値昇格の規則が適用される数値を比較することが有効であるということです。似ていない型の値を比較しようとする条件式は、この数値の場合を除いて許可されていません。

私にとっては、仕様によれば、パスがlongを指している場合は、INにもintパラメーターを指定できるように見えますが、少なくともHibernateの実装ではそうではありません。

于 2012-05-18T16:51:26.007 に答える