2011-02-11 14 views
9

quiero insertar datos en una tabla usando el siguiente código¿Cómo insertar valores en la base de datos usando consultas usando el administrador de entidades, persistencia usando una clase java?

public User registerUser(String usr, String pwd) { 

    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return null; 
    } 
    String query1 = "insert into users values('" + usr + "','" + pwd +"')"; 
    Query q = em.createQuery(query1); 
    u=em.find(User.class,usr); 
    return u; 

}

aquí 'u 'es el objeto de User clase y em es EntityManager.

recibí este siguiente excepción:

Servlet.service() para la acción servlet excepción arrojó org.hibernate.hql.ast.QuerySyntaxException: esperando ABIERTA, que se encuentra cerca de la línea 1 'valores', columna 19 [inserte en los valores de los usuarios ('pawan', 'am')]

Respuesta

15

Trate

public User registerUser(String usr, String pwd) { 

    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return null; 
    } 

    //Now saving... 
    em.getTransaction().begin(); 
    em.persist(u); //em.merge(u); for updates 
    em.getTransaction().commit(); 
    em.close(); 

    return u; 
} 

Si la PK es Identidad, que se ajusta automáticamente en su clase PERSISTED, si está utilizando la estrategia de generación automática (gracias a David Victor).

Editar para @aman_novice comentario: la pusieron en su clase

//Do this BEFORE getTransaction/persist/commit 
//Set names are just a example, change it to your class setters 
u.setUsr(usr); 
u.setPwd(pwd); 

//Now you can persist or merge it, as i said in the first example 
em.getTransaction().begin(); 
(...) 

Acerca @ David Victor, perdón, me olvidé de eso.

+0

¿cómo insertará esto la pwd en la tabla de usuario, junto con el usuario? –

+0

El PK solo se configurará según la estrategia de generación. es decir, una anotación @GeneratedValue (strategy = GenerationType.AUTO) o similar. También es mejor confiar en los límites declarativos de txn en general. –

0

Esto no es realmente el camino a seguir. Está intentando insertar una fila en una tabla, pero no tiene ninguna entidad asociada asociada. Si está utilizando el administrador de entidades JPA - luego, cree una nueva instancia - establezca las propiedades & persista la entidad.

E.g.

User u = new User(); 
u.setXXX(xx); 

em.persist(u); 
// em.flush() <<-- Not required, useful for seeing what is happening 

// etc.. 

Si habilita loggging SQL en Hibernate & vaciar la entidad entonces verás lo que se envía a la base de datos.

E.g. en persistence.xml:

<property name="hibernate.format_sql" value="true" /> 
5

no se está usando SQL, pero JPAQL, no hay inserto sobre el terreno. Usted persiste el objeto en lugar de insertar filas.

Usted debe hacer algo como esto:

public User registerUser(String usr, String pwd) { 
    u=em.find(User.class,usr); 
    if(u!=null) 
    { 
     return u; 
    } 
    u = new User(usr, pwd); 
    em.persist(u); 
    return u; 
} 
+0

ya cierto ... mi mal ... lo escribió como SQL. sin embargo, me gustaría señalar que User() es un constructor sin parámetros. ¡Entonces no puedo crear ese objeto! :( –

+0

@aman_novice: bueno, utiliza los métodos setter para establecer el nombre de usuario y la contraseña. –

+0

Creo que aquí habrá un problema con el tipo de identificador para la clase User. Necesito asegurarme de que el tipo de id es String en el Entidad. Lo que funcionaría, pero es inusual. :-) –

Cuestiones relacionadas