2016-09-28 15 views
0

以下のコードに示すように、TestAuthorとTestBookの2つのハイバネートクラスがあります。私はテーブルにいくつかのレコードを挿入し、それらは正常に挿入されました。レコードが正式に挿入されたことを確認するために、私は次の SQLがリストをテーブル名にキャストする方法

SELECT * from TESTAUTHOR; 
SELECT * from afk_owner.TestBook; 

コマンドを使用、私は以下のPRINTALLセクションに示されているHibernateのコマンドを使用して、テーブルtestbookの内容を表示するようになりましたします。私がメソッドを実行するとPrintAll例外が表示されます。

cannot be cast to msc.hibernate.persistence.TestBook 

なぜ私はこのエラーを解決し、解決するのですか?

PRINTALL

private void printAll() { 

    for (TestBook book : (List<TestBook>) HibernateUtil.getCurrentSession().createSQLQuery("SELECT * from afk_owner.testbook").list()) { 

     System.out.println(book.getmISBN() + ", " + book.getmTitle() + " " + (book.getAuthor())); 
    } 
} 

TestAuthor

@Entity @Table(schema = "afk_owner", name = "testauthor") 
public class TestAuthor { 

@Id 
@Column(name = "authorid") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequencegen") 
@SequenceGenerator(name = "sequencegen", sequenceName = "afk_owner.testauthor_seq", allocationSize = 1) 
private Integer mAuthorID; 

@Column(name = "FNAME") 
private String mFName; 

@Column(name = "LNAME") 
private String mLName; 

@OneToMany(mappedBy = "author") 
private List<TestBook> books; 

public Integer getmAuthorID() { 
    return mAuthorID; 
} 

public void setmAuthorID(Integer mAuthorID) { 
    this.mAuthorID = mAuthorID; 
} 

public String getmFName() { 
    return mFName; 
} 

public void setmFName(String mFName) { 
    this.mFName = mFName; 
} 

public String getmLName() { 
    return mLName; 
} 

public void setmLName(String mLName) { 
    this.mLName = mLName; 
} 

public TestAuthor() { 
    // TODO Auto-generated constructor stub 
} 
} 

TestBook

@Entity @Table(schema = "afk_owner", name = "testbook") 
public class TestBook { 

@Id 
@Column(name = "ISBN") 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequencegen") 
@SequenceGenerator(name = "sequencegen", sequenceName = "afk_owner.testbook_seq", allocationSize = 1) 
private Long mISBN; 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "authorid") 
private TestAuthor author; 

@Column(name = "title") 
private String mTitle; 

public Long getmISBN() { 
    return mISBN; 
} 

public void setmISBN(Long mISBN) { 
    this.mISBN = mISBN; 
} 

public TestAuthor getAuthor() { 
    return author; 
} 

public void setAuthor(TestAuthor author) { 
    this.author = author; 
} 


public String getmTitle() { 
    return mTitle; 
} 

public void setmTitle(String mTitle) { 
    this.mTitle = mTitle; 
} 

public TestBook() { 
    // TODO Auto-generated constructor stub 
} 
} 

答えて

0

I Hibernate APIとネイティブSQLを使用することはできません。タイプコントロールはありませんので、キャストする必要があります。 Session Api docsによれば可能ですが、それはrelevant part of documentationには表示されません。あなたのニーズに合わせて使い方を理解する必要があります。これらのソリューションは廃止予定とマークされているため、まったく使用しないでください。むしろ、JPAへの移行を試み、その実装としてHibernateを使用するべきです。

一方、HQLを使用すると動作する可能性があります。クエリは、このようなものになるだろう:

Query<TestBook> query=session.createQuery("SELECT tb FROM TestBook tb WHERE tb.author.mAuthorID=:owner",TestBook.class); 
query.setParameter("author",authorId); 
List<TestBook> books=query.list(); 

あなたは自分のニーズに合うようにプロパティ名(TB、著者、idプロパティ)などを調整する必要がありますが、あなたはそれを使用する方法のアイデアを得ることができます。

+0

CreatSQLQueryと一致するように答えを変更してください。 – user2121

+0

@ user2121 nope申し訳ありませんが、提供されたリンクを使用して自分で試してみるか、JPAに切り替えるかHQLを使用する必要があります。 – Antoniossss

関連する問題