3

リストを特定のオブジェクトに型キャストすると、以下の例外が発生します。私はそれを正しくやっていると思います。コードの何が問題なのか誰でも提案できますか?

SEVERE: Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to retail.model.vo.Book
SEVERE:     at retail.ejb.service.ProductsSessionBeanImpl.showBookDetails(ProductsSessionBeanImpl.java:40)
SEVERE:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
SEVERE:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
SEVERE:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
SEVERE:     at java.lang.reflect.Method.invoke(Method.java:601)
SEVERE:     at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
SEVERE:     at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
SEVERE:     at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5388)
SEVERE:     at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:619)
SEVERE:     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
SEVERE:     at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:571)
SEVERE:     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:162)
SEVERE:     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:144)
SEVERE:     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
SEVERE:     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
SEVERE:     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
SEVERE:     at java.lang.reflect.Method.invoke(Method.java:601)
SEVERE:     at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:861)
SEVERE:     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:800)
SEVERE:     at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:370)
SEVERE:     at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5360)
SEVERE:     at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5348)
SEVERE:     at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:206)
SEVERE:     ... 54 more


@Override
        public List<Book> showBookDetails() {
            List<Book> book = em.createQuery("select p,b from Products p,Book b where p.productId=b.productId").getResultList();
            //PRODUCT,book where PRODUCT.PRODUCT_ID = book.product_id
            System.out.println("List Size:::"+ book.size());
            //Customer obj = new Customer();
            List<Book> booksList = new ArrayList<Book>(); 
            for(int i=0; i<book.size();i++){




                Book books = (Book) book.get(i);
                System.out.println("Author ::::" + books.getAuthor() + "::ISBN ::"+books.getIsbnNumber()+"::pages::"+books.getNoOfpages()+"::price::"+books.getPrice()+
                        ":::description::"+books.getProductDesc() + "::product id ::"+books.getProductId()+"::title::"+books.getProductTitle()+"::Stock::"+books.getStock());
                booksList.add(books);
                //obj.setCustomerList(customersList);
            }
            return booksList;
        }

    }


package retail.model.vo;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.PrimaryKeyJoinColumn;
@Entity
@PrimaryKeyJoinColumn(name="product_id")

public class Book extends Products implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4264546498700495061L;

    private String author;
    private String isbnNumber;
    private int noOfpages;
    private String illustrations;

    @Column(name = "author")
    public String getAuthor() {
        return author;
    }
    public void setAuthor(String author) {
        this.author = author;
    }

    @Column(name = "isbn_number")
    public String getIsbnNumber() {
        return isbnNumber;
    }
    public void setIsbnNumber(String isbnNumber) {
        this.isbnNumber = isbnNumber;
    }

    @Column(name = "noof_pages")
    public int getNoOfpages() {
        return noOfpages;
    }
    public void setNoOfpages(int noOfpages) {
        this.noOfpages = noOfpages;
    }

    @Column(name = "illustrations")
    public String getIllustrations() {
        return illustrations;
    }
    public void setIllustrations(String illustrations) {
        this.illustrations = illustrations;
    }



}
4

4 に答える 4

6
em.createQuery("select p,b from Products p,Book b where p.productId=b.productId").getResultList(); 

実際には、オブジェクト配列のリスト ( List<Object[]>) を返します。オブジェクト配列の最初の要素は Product で、2 番目の要素は Book です。

コンパイラは、getResultList からどのジェネリック型がアプリオリに返されるかわからないため、これらの場合にのみ警告を出します。実行時に、型消去のためにその行で ClassCastException を取得しません。から への最初の実際のキャストはObject[]、最初の list.get で行われます。ListBook

あなたの問題の解決策は、クエリを次のように変更することだと思います。

List<Book> book = em.createQuery("select b from Products p,
 Book b where p.productId=b.productId").getResultList();

実際に有効な本のリストを返します。

于 2013-04-28T10:54:04.637 に答える
1

createQuery はここにオブジェクトのリストを返します

変化する

 List<Book> book = em.createQuery("select p,b from Products p,
 Book b where p.productId=b.productId").getResultList();

  List<Object[]> book = em.createQuery("select p,b from Products p,
 Book b where p.productId=b.productId").getResultList();
于 2013-04-28T10:54:55.963 に答える
1

Objectクエリが配列のリストを返す場合は、次の行を変更するだけです。

List<Object> book = em.createQuery("select p,b from Products p,Book b where p.productId=b.productId").getResultList();

そして、ループでキャストを行うと、問題ありません。

Book books = (Book) book.get(i);
于 2013-04-28T10:57:08.850 に答える
0

参考までに、Springを使用してNeo4jオブジェクトをJavaエンティティに変換すると同じ問題が発生しました

私はクエリに名前を付けました:

 MATCH [bla-bla] RETURN a.name, a.associatedApplications

およびエンティティ:

@QueryResult
@XmlRootElement
public class SomeDescriptor {
    @ResultColumn("a.name")
    private String name ;

    @ResultColumn("a.associatedApplications")
    private List<String> associatedApplications = new ArrayList<String>();
}

同じエラー:

    Neo4j java.lang.classcastexception: [ljava.lang.string; cannot be cast to java.lang.iterable

Neo4j COLLECT() 関数を使用した後、すべて正常に機能していました!

更新された名前付きクエリ:

 RETURN a.name, COLLECT(a.associatedApplications) as associatedApplications

そしてエンティティを更新しました:

@QueryResult
@XmlRootElement
public class SomeDescriptor {
    @ResultColumn("a.name")
    private String name ;

    @ResultColumn("associatedApplications")
    private List<String> associatedApplications = new ArrayList<String>();
}
于 2015-03-06T13:46:15.480 に答える