2012-05-29 22 views
7

Estoy usando PlayFramework y realmente me está gustando. Cuando quiero tomar datos de una tabla, por ejemplo, tengo una tabla user, yo uso la siguiente sintaxis:Uniones complejas usando Play Framework y Ebean

List<User> users = User.find.where().eq("email", email).findList(); 

Mi pregunta es que cuando llegue el objeto de usuario, tengo una columna id. Con ese valor id puedo mapear a otras tablas y las id de esas tablas se pueden mapear a incluso más tablas, por lo que el concepto básico de unión en varias tablas. ¿Hay algún ejemplo o lugar en el que pueda leer dónde se describe cómo implementarlo con la sintaxis anterior?

Traté de encontrarme y no pude, solo puedo pensar en esto en este momento es utilizar sql directo con declaraciones preparadas que prefiero no hacer.

Respuesta

16

ellou' kalvish

Relationships entre los modelos se ajustan con anotaciones JPA comunes como @OneToMany, @ManyToOne, @OneToOne, etc.

Así que si usted tiene User.java modelo para la tabla de usuario y Question.java modelo para la pregunta del usuario que pueda unirse a ellos con @OneToMany (Una User tiene muchos Question s)

usuario

@Entity 
public class User extends Model { 
    @Id 
    public Long id; 

    public String email; 

    @OneToMany 
    public List<Question> questions; 
} 

Pregunta

@Entity 
public class Question extends Model { 
    @Id 
    public Long id; 

    public String question; 
} 

Cuando usted selecciona un usuario en el controlador, Ebean interpretará 'une' por defecto y se ha podido ir a todas las preguntas de los usuarios, así:

User user = User.find.where().eq("email", email).findUnique(); 
List<Question> usersQuestion = user.questions; 

Por defecto Ebean recupera todas las propiedades y relaciones de los objetos, por lo que no necesita crear subconsultas. Por supuesto, puede o incluso debe seleccionar/obtener solo los datos que se requieren en este momento.

Al official Ebean documentation page encontrará bastante bueno guía de referencia (pdf), descripción general de la relación está disponible en la sección 11.6.2 Relationships.

En la sección 4.1.2 Query no es ejemplo (segundos), que muestra cómo obtener el objeto "parcial" con el uso de select() y fetch()

+1

Hola Marcus, Gracias por su respuesta. Estaba mirando el manual hace un momento, y me pregunto si podría hacerte una pregunta al respecto ... la sección 4.1.5 describe OneToMany, ManyToOne, etc. Pero, ¿cómo sabe qué columnas se asignan? Digamos que tengo una columna 'myId' y que se asigna a una columna' id' en otra tabla, ¿hay alguna manera de especificar eso? – KVISH

+0

Ebean es lo suficientemente inteligente como para crear DDL apropiado en el cambio de modelo. Tenga cuidado con esto en el caso real, pero es una buena idea crear otro proyecto de prueba y simplemente aprenderlo directamente de Ebean – biesior

+0

@KVISH Creo que lo que está buscando es la anotación JPA @ JoinColumn donde puede especificar el nombre de la columna de unión usar. –