2

这是我第一次使用 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 扩展了 Class Media。

但我得到的错误是

org.hibernate.QueryException: 无法解析属性:MediaID of: mediaManagement.Media [SELECT m.title, b.isbn, b.authors FROM mediaManagement.Book b, mediaManagement.Media m WHERE m.MediaID = b.MediaID]

这是媒体类。

@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;
}

这是书类。

@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
}

}

任何人都可以帮忙吗?

4

1 回答 1

3

如果书扩展了媒体,你为什么要加入媒体表?(尽管使用 Book 和 Media 类和映射会更容易)

查询“Book”对象就足够了。也许“MediaId”应该是“mediaId”。Hibernate 的属性名称区分大小写。

于 2012-05-27T20:08:24.217 回答