这是我第一次使用JPA。我用Java和JPA编写代码。我的代码如下。
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扩展了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
}
}
任何人都可以提供帮助吗?
答案 0 :(得分:3)
如果图书扩展了媒体,为什么要加入媒体表? (尽管使用Book和Media类和映射会更容易)
查询“Book”对象应该足够了。也许“MediaId”应该是“mediaId”。 Hibernate对它的属性名称区分大小写。