Tengo dos entidades, Libro y Autor.

@Entity
@Table(name="book") 
class Book {
    private int id;
    private Map<Integer, Author> authors = new HashMap<Integer, Author>();

    @Id
    @GeneratedValue
    @Column(name="id_book")
    public int getId() {
        return this.id;
    }

    @OneToMany(fetch=FetchType.EAGER)
    @JoinTable(name="book_author", joinColumns= {@JoinColumn(name="id_book")},
            inverseJoinColumns = {@JoinColumn(name="id_author", table="author")})
    @MapKeyColumn(name="order")
    public Map<Integer, Author> getAuthors() {
        return authors;
    }


}

@Entity
@Table(name="author")
class Author {

    private int id;
    private String lastname;
    private String firstname;

    @Id
    @Column(name="id_author")
    @GeneratedValue
    public int getId() {
        return id;
    }

    public String getLastname() {
        return lastname;
    }

    public String getFirstname() {
        return firstname;
    }

}

Un libro tiene muchos autores que se mencionan en un orden determinado. Ahora estoy tratando de crear un HQL tales que puedo obtener una lista de libros de un determinado autor, en particular con el nombre o apellido o ambos. Estoy confundido sobre cómo usar la combinación entre dos entidades. Alguna idea?

Gracias de antemano.

InformationsquelleAutor suenda | 2013-01-14

1 Comentario

  1. 4

    Primero: Usted tiene una relación de uno a muchos relación entre los libros y los autores. Un libro puede tener muchos autores, pero un autor sólo puede haber escrito un solo libro. Si a una persona real que ha escrito muchos libros, entonces él tiene muchas filas de la tabla autor, uno para cada uno de sus libros. Esto podría no ser lo que usted ha deseado, se ha definido la relación como esta.

    El uno a muchos relación de obras en el lado de la base de datos con el id de el libro en la mesa de autor. Hacer este id disponibles en Java mediante la creación de un captador de getBookID()en Author. A continuación, puede utilizar el HQL declaración

    from Book b inner join Author a 
       where b.id  = a.bookId
          and a.lastname = :ln
          and a.firstname = :fn

    o

    from Book b where b.id in (select bookId from Author a
                                  where a.lastname = :ln
                                  and a.firstname = :fn)

    Segundo: Ahora puede preferir un Autor puede tener muchos libros. Entonces usted tiene muchos-a-muchos de relación. Para esto es recomendable introducir una cruz de la tabla que contiene la relación de muchos a muchos. Esta cruz de la tabla sólo contiene dos columnas, el libro de identificación y la identificación del autor, y el Libro y el Autor tiene una relación de uno a muchos relación a él (y el Autor no tiene la bookId más). El HQL declaraciones son similares a la primera, excepto que ellos van a través de tres mesas.

    Edit: Con su Book_Author tabla:
    Para su seleccione tienes que crear una clase BookAuthor, que se asigna a la tabla.
    A continuación, puede utilizar el HQL declaración

    from Book b inner join BookAuthor ba inner join Author a 
       where b.id  = ba.bookId
          and ba.authorId = a.id
          and a.lastname = :ln
          and a.firstname = :fn

    o

    from Book b where b.id in (select ba.bookId from BookAuthor ba, Author a
                                  where ba.authorId = a.id
                                     and a.lastname = :ln
                                     and a.firstname = :fn)
    • Yo no agregar cualquier idBook de autor porque no me quería obligar a que el autor de un libro en particular como un autor puede tener muchos libros escritos. En realidad mi confusión era ¿cómo puedo enlazar tres tablas como yo tenemos una clase para el Autor y una clase de Libro y su vínculo se define en book_author tabla en la base de datos. No veo cómo se representan en la clase o cómo hago para que los represente en HQL. Alguna idea?
    • He editado mi respuesta. Véase más arriba, tienes que crear una clase para la tabla de combinación.
    • Gracias por tu ayuda. Tenía la esperanza de hacer sin crear BookAuthor pero parece que tengo que crear de todos modos y voy a hacerlo. Gracias de nuevo por tu ayuda
    • A mí me parece que el uso de consultas SQL en lugar de HQL es más eficiente en este caso ya que no requiere de mí para crear nuevas clases como BookAuthor.
    • Por qué? La creación de la clase extra no te cuesta nada (el rendimiento es el mismo), también el HQL generado instrucción select es la misma que los nativos de SQL en medio de rendimiento. Si utiliza SQL nativo, a continuación, usted podría perder la portabilidad a otras bases de datos.

Dejar respuesta

Please enter your comment!
Please enter your name here