2012-05-27 163 views
2

這是我第一次使用JPA。我用Java和JPA編寫代碼。我的代碼如下。org.hibernate.QueryException:無法解析屬性

String queryStr = "SELECT m.title, b.isbn, b.authors"; 
    queryStr += " FROM Book b, Media m"; 
    queryStr += " WHERE m.MediaID = b.MediaID"; 
      queryStr += " AND b.isbn = '" + isbn + "' AND m.title = '%" + title +"%'"; 
Query query = em.createQuery(queryStr); 

從我的代碼中,Class Book擴展了class Media。

但我這是

org.hibernate.QueryException錯誤:無法解析屬性:的MediaID:mediaManagement.Media [SELECT m.title,b.isbn,b.authors FROM mediaManagement。 Book b,mediaManagement.Media m WHERE m.MediaID = b.MediaID]

這是Media類。

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@Table(name = "Media") 
@NamedQuery(name = "findAllMedias", query = "select b from Media b") 
public class Media { 

@Id 
@Column(name = "MediaID") 
@GeneratedValue(strategy = GenerationType.IDENTITY) 
private int mediaID; 

/** 
* Getter of the property <tt>mediaID</tt> 
* 
* @return Returns the mediaID. 
* @uml.property name="mediaID" 
*/ 
public int getMediaID() { 
    return mediaID; 
} 

/** 
* Setter of the property <tt>mediaID</tt> 
* 
* @param mediaID 
*   The mediaID to set. 
* @uml.property name="mediaID" 
*/ 
public void setMediaID(int mediaID) { 
    this.mediaID = mediaID; 
} 

/** 
* @uml.property name="title" 
*/ 
@Column(name = "title") 
private String title; 

/** 
* Getter of the property <tt>title</tt> 
* 
* @return Returns the title. 
* @uml.property name="title" 
*/ 
public String getTitle() { 
    return title; 
} 

/** 
* Setter of the property <tt>title</tt> 
* 
* @param title 
*   The title to set. 
* @uml.property name="title" 
*/ 
public void setTitle(String title) { 
    this.title = title; 
} 

/** 
* @uml.property name="editionDate" 
*/ 

private Calendar editionDate; 

/** 
* Getter of the property <tt>editionDate</tt> 
* 
* @return Returns the editionDate. 
* @uml.property name="editionDate" 
*/ 
public Calendar getEditionDate() { 
    return editionDate; 
} 

/** 
* Setter of the property <tt>editionDate</tt> 
* 
* @param editionDate 
*   The editionDate to set. 
* @uml.property name="editionDate" 
*/ 
public void setEditionDate(Calendar editionDate) { 
    this.editionDate = editionDate; 
} 

/* 
* Two medias are equal if their mediaID is the same 
*/ 
@Override 
public boolean equals(Object media) { 
    if (media == null) 
     return false; 
    Media b = (Media) media; 

    if (b.mediaID == mediaID) 
     return true; 

    return false; 
} 

public Media() { 
}; 

/** 
* Creates a media All parameters should be given 
* 
* @param title 
*   the title of the media 
* 
* @param editionDate 
*   date of the edition of the media 
* 
* @throws BadParametersException 
*/ 
public Media(String title, Calendar editionDate) 
     throws BadParametersException { 
    if ((title == null) || (editionDate == null)) 
     throw new BadParametersException(); 

    this.title = title; 
    this.editionDate = editionDate; 

} 

/** 
* Returns a description of the media 
*/ 
public String toString() { 
    return this.title + " " + String.valueOf(this.title); 
} 

/** 
* @uml.property name="copies" 
* @uml.associationEnd multiplicity="(0 -1)" inverse="media:copyManagement.Copy" 
*/ 
@OneToMany(mappedBy="mediaRef") protected Set<Copy> copies; 

public void addCopy(Copy copy) { 
    copies.add(copy); 
} 

/** 
* Getter of the property <tt>copies</tt> 
* @return Returns the copies. 
* @uml.property name="copies" 
*/ 
public Set<Copy> getCopies() { 
    return copies; 
} 

/** 
* Setter of the property <tt>copies</tt> 
* @param editionDate The copies to set. 
* @uml.property name="copies" 
*/ 
public void setCopies(Set<Copy> copies) { 
    this.copies = copies; 
} 

這是Book類。

@Entity 
@Table(name = "Book") 
@NamedQuery(name = "findAllBooks", query = "select b from Book b") 
public class Book extends Media { 
/** 
* @uml.property name="authors" 
*/ 
@Column(name = "authors") 
private ArrayList<String> authors; 

/** 
* Getter of the property <tt>authors</tt> 
* 
* @return Returns the authors. 
* @uml.property name="authors" 
*/ 
public ArrayList<String> getAuthors() { 
    return authors; 
} 

/** 
* Setter of the property <tt>authors</tt> 
* 
* @param authors 
*   The authors to set. 
* @uml.property name="authors" 
*/ 
public void setAuthors(ArrayList<String> authors) { 
    this.authors = authors; 
} 

/** 
* @uml.property name="isbn" 
*/ 

@Column(name = "isbn") 
private String isbn; 

/** 
* Getter of the property <tt>isbn</tt> 
* 
* @return Returns the isbn. 
* @uml.property name="isbn" 
*/ 
public String getisbn() { 
    return isbn; 
} 

/** 
* Setter of the property <tt>isbn</tt> 
* 
* @param isbn 
*   The isbn to set. 
* @uml.property name="isbn" 
*/ 
public void setisbn(String isbn) { 
    this.isbn = isbn; 
} 

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

public Book(String title, Calendar editionDate, ArrayList<String> authors, 
     String isbn) throws BadParametersException { 
    super(title, editionDate); 
    this.authors = authors; 
    this.isbn = isbn; 
    // TODO Auto-generated constructor stub 
} 

} 

任何人都可以幫忙嗎?

+1

你可以在你的問題中使用映射文件(如果使用)發佈'Media'和'Book'類嗎? – darrengorman

+0

我已經發布 – user1412944

回答

3

如果本書擴展了媒體,爲什麼要加入媒體表? (儘管書和媒體類和映射會更容易)

查詢「Book」對象應該足夠了。也許「MediaId」應該是「mediaId」。 Hibernate對其屬性名稱是區分大小寫的。

+0

其實我忘了在WHERE之後添加AND m.MediaID = b.MediaID – user1412944

相關問題