2017-02-13 3 views
0

Ich brauche InputStream oder Byte [] (Profilbild) in der Tabelle mit Hibernate zu speichern. hier Code:Bild speichern Hibernate mit sql (don't hql)

@Override 
public void actualizarFotoPerfil(String id, byte[] image) throws CotrafaException { 

    Session session = this.getHibernateTemplate().getSessionFactory().getCurrentSession(); 

    String sql = "UPDATE TS_USU_FOTOS SET FOTO = ? WHERE CLIENTE = ?"; 
    SQLQuery query = session.createSQLQuery(sql); 

    Blob b = Hibernate.createBlob(image); 
    query.setParameter(0, b.toString()); 
    query.setParameter(1, id); 

    query.executeUpdate(); 

    session.flush(); 

} 

Tabelle in BD

create table TS_USU_FOTOS 
(
    cliente NUMBER(8) not null, 
    foto BLOB 
) 

und Fehler ist: Verursacht durch: java.sql.SQLSyntaxErrorException: ORA-00932: tipos de Dato inconsistentes: se esperaba NUMBER se ha obtenido BINARY ADVERTENCIA: /pages/common/cambiarFoto.xhtml @ 34,74 fileUploadListener = "# {barraBB.actualizarFoto}": org.hibernate.exception.SQLGrammarException: native Bulk-Manipulationsabfrage konnte nicht ausgeführt werden javax.el.ELException:/pages/common/cambiarFoto.xhtml @ 34,74 fileUploadListener = "# {barraBB.actualizarFoto} ": org.hibernate.exception.SQLGrammarException: konnte die native Bulk-Manipulationsabfrage unter com.sun.faces.facelets.el.TagMethodExpression.invoke (TagMethodExpression.java:111) nicht ausführen bei org.primefaces. component.fileupload.FileUpload.broadcast (FileUpload.java:310) bei javax.faces.component.UIViewRoot.broadcastEvents (UIViewRoot.java:755) bei javax.faces.component.UIViewRoot.processDecodes (UIViewRoot.java:931) bei com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute (ApplyRequestValuesPhase.java:78) bei com.sun.faces.lifecycle.Phase.doPhase (Phase.java:101) bei com.sun.faces.lifecycle. LifecycleImpl.execute (LifecycleImpl.java:198) bei javax.faces.webapp.FacesServlet.service (FacesServlet.java:646)

+0

Warum rufen Sie toString auf Ihrem Blob? – Andreas

Antwort

1

Meine Vermutung wäre, Sie hätten FOTO Spalte des Typs blob. Aber Sie übergeben Zeichenfolge als Parameter b.toString(). Versuchen Sie toString zu entfernen und übergeben Sie einfach b

+0

'query.setBinary (0, b);' könnte auch funktionieren. – Andreas

+0

versuchen Sie es mit 'query.setParameter (0, b)' oder 'query.setBinary (0, image);' und der Fehler lautet: 'se esperaba NUMMER se ha obtenido BINARY'. –

+0

Dann sieht "FOTO" wie folgt aus: "NUMBER". Wir können Ihnen nicht weiter helfen, ohne Ihr Datenbankschema zu kennen. Aber im Allgemeinen müssen Sie in Java dieselben Typen wie in der Datenbank festlegen. Wenn 'FOTO' eine Zahl ist, dann in' query.setParameter (0, value) ', muss' value' ein Zahlentyp in java sein (Integer, Long, etc.) Hier finden Sie das Mapping: https: //docs.oracle.com/cd/A87860_01/doc/java.817/a83724/basic3.htm – nkukhar