0

Hibernate を使用して、Oracle データベースから選択したフィールドを含む行のリストを取得しています。私のアプリケーションの DAO の 1 つで、次のメソッドによって取得が行われます。

@SuppressWarnings("unchecked")
public List<Object[]> getOldFileName(String []ids)
{
    int len=ids.length;
    Long longType[]=new Long[len];

    for(int i=0;i<len;i++)
    {
        longType[i]=Long.valueOf(ids[i]);
    }
    return sessionFactory.getCurrentSession().createQuery("select catId, catImage from Category where catId in(:id)").setParameterList("id", longType).list();
}

ここでは、Spring を介してメソッド パラメーターとして配列として提供されたものに基づいて、指定された HQL クエリにリストされている2 つのフィールドcategoryIdをフェッチしています。それはうまく機能し、それについて疑問の余地はありません。categoryImagecatIdString[]

しかし、私の要件に関しては、catId再度取得することは完全に不要でありcatId、次のように単純にクエリのフィールドのリストから削除したいと思います。

select catImage from Category where catId in(:id)

このクエリを実行しようとすると、Spring コントローラー クラス内の前のメソッドへの次の呼び出し、

String temp[]=request.getParameter("setDel").split(",");
List<Object[]> oldFileNames = categoryService.getOldFileName(temp); 
//Invokes the preceding method in DAO.

次の例外がスローされます。

java.lang.ClassCastException: java.lang.String は [Ljava.lang.Object; にキャストできません。

例外メッセージは、java.lang.Stringをオブジェクトの配列にキャストできないことを示しています - Object[]。HQL ステートメントは、取得するのではなく、String 型の値を 1 つだけ取得しようとしているようですList<Object[]>

データベースから名前を取得した後、ディレクトリに保存されているファイルを削除したいだけでcatId、HQL のフィールドのリストに言及する必要はまったくありません。

catIdこのシナリオで HQL ステートメントのフィールドのリストに追加する必要があるのはなぜですか?

4

1 に答える 1

1

リストの戻り値の型は List である必要があります。1 つの列だけが戻ってくると、休止状態は結果を and Object[] に入れません。

于 2013-01-17T21:49:31.730 に答える