2010-09-02 10 views
6

No puedo usar la ordenación en tablas de unión. Dejame explicar;criterios de hibernación api join table problema

tengo tres tablas. usuarios, roles y user_roles. mis entidades JPA son User, UserRole, UserRolePK, Role.

|User |  | UserRole |  | UserRolePK |  | Role | 
|--------|  |----------|  --------------  -------- 
|id  |  | pk  |  | user  |  | id | 
|name |      | role  |  | name | 

, de hecho, la salida que quiero es: "SELECT * FROM usuarios unirse a user_roles ur U en u.ID = ur.UserID ORDER BY u.name;"

así que trato de usar la API de criterios de hibernación.

CriteriaImpl criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.addOrder(Order.asc("pk.user.name")); 
List userRoles = criteria.list(); 

El error es no pudo resolver la propiedad: pk.user.name de: models.UserRole

¿Cómo puedo utilizar los criterios del API de unir tablas?

Respuesta

9

Si a las referencias de clases otras clases que no pueden simplemente acceder a sus propiedades en Restricciones y Órdenes. Deberá crear un alias para los objetos a los que se hace referencia y luego usar el alias para definir Restricciones y Órdenes en los otros objetos.

Criteria criteria = (CriteriaImpl) session.createCriteria(UserRole.class); 
criteria.createAlias("pk", "a1"); 
criteria.createAlias("a1.user", "a2"); 
criteria.addOrder(Order.asc("a2.name")); 
List userRoles = criteria.list(); 

Las definiciones de alias crearán una unión con las tablas de las otras clases. Solo las propiedades que se asignan directamente a la tabla de la clase o un alias se pueden usar en Restricciones u Órdenes. Si su clase contiene componentes, se puede acceder directamente sin un alias.

+0

parece bueno pero no funcionó. Columna desconocida 'a2x2_.Denomine la cláusula 'in' order ' y esta es la consulta SQL generada por la API de criterios. __ "seleccione this_.RoleID como RoleID614_0_, this_.UserID como UserID614_0_ de user_roles this_ orden por a2x2_.Name asc" __ –

+0

Quizás haya algún problema con la asignación. La creación de un alias normalmente debe unirse a la tabla, si la propiedad es una relación de muchos a uno. Los gráficos de su mesa no contienen ninguna relación. Tal vez deberías agregarlos o agregar el mapeo a la pregunta. – Reboot

1

Bueno, en primer lugar creo que deberíamos ver las asignaciones de entidades (clases Java)

Por otro lado, voy a asumir que su clase UserRole tiene una referencia a una instancia de usuario.

@Entity 
    @Table (name="UserRole") 
    public class UserRole{ 

     User user; 

     @OneToMany //correct mapping here 
     public User getUser(){return this.user;} 


    } 

Debe utilizar createCriteria para navegar por el association.

public List<UserRole> getRolesWithUser(){ 
    Criteria userRoleCriteria = session.createCriteria(UserRole.class); 
    userRoleCriteria.createCriteria("user"); //joins the table. 
    userRoleCriteria.addOrder("user.name"); //adds order 

    return criteria.list(); 
} 

El problema con esto es que va a traer casos de UserRole, pero se puede navegar a User.

List<UserRole> userRoles = getRolesWithUser(); 

for (UserRole role:userRoles){ 

    User user = role.getUser(); 
    //do something with role , user 
} 

Eche un vistazo a Criteria API. ¡Siempre es útil!

+0

En la tabla user_roles, las columnas UserID y RoleID son claves principales. Así que utilicé la clave incrustada y la clase adicional (UserRolePK) para ello. UserRolePK tiene una asignación correcta. –

1

muy fácil sólo tiene que utilizar createCriteria sobre las asociaciones:

Criteria c=session.createCriteria(User.class) 
        .createCriteria("roles") 
        .add(Restrictions.eq("name","test") 
        .list(); 

Esto se uniría a dos mesas para el usuario ENTIDADES y sus "roles" Colección asociados. y devolvería a todos los usuarios que tienen un rol asociado a ellos mismos llamado "prueba".

esperanza de que ayudó

+0

No hay muchas propiedades de relación como funciones en la entidad Usuario. En cambio, utilicé la entidad UserRole. –

Cuestiones relacionadas