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
をフェッチしています。それはうまく機能し、それについて疑問の余地はありません。categoryImage
catId
String[]
しかし、私の要件に関しては、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 ステートメントのフィールドのリストに追加する必要があるのはなぜですか?