使用NamedQuery在hibernate中更新查询

时间:2014-10-02 15:37:40

标签: java hibernate hql named-query

学习Hibernate。不确定这是否是一个正确的问题......

我正在尝试将[{1}}用于我的表格中的NamedQuery

Update

主程序

mysql> select * from hib1;
+----+--------+---------+
| id | name   | surname |
+----+--------+---------+
|  1 | jack   | NULL    |
|  2 | rose   | NULL    |
|  3 | mathew | NULL    |
|  4 | jack   | NULL    |
|  5 | rose   | NULL    |
|  6 | Harold | kumar   |
+----+--------+---------+

Employee.java

public static void main(String[] args) throws Exception {

        SessionFactory sessFact = HibernateUtil.getSessionFactory();
        Session session = sessFact.openSession();
        org.hibernate.Transaction tr = session.beginTransaction();
        Employee emp = new Employee();

        Query updateQ = session.getNamedQuery("UpdateSurnameOfName");

        updateQ.setParameter("name","jack");
        updateQ.setParameter("surname","dawson");

        session.save(emp);
        session.getTransaction().commit();

        Iterator itr = list.iterator();

        while(itr.hasNext()){
            Employee e = (Employee)itr.next();
            System.out.println("Name is : "+e.getName());
        }
        sessFact.close();

    }

问题:

但出于某些原因而不是package hibernate_tut_emp; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.NamedQueries; import javax.persistence.NamedQuery; @Entity @Table(name="hib1") @NamedQueries({ @NamedQuery(name="GetDetailsByName" , query="select id from Employee emp where emp.name=:name"), @NamedQuery(name="FindCountOfNames", query="select count(1) as cnt from Employee emp where emp.name=:name"), @NamedQuery(name="UpdateSurnameOfName",query="update Employee emp set emp.surname=:surname where emp.name=:name") }) public class Employee { @Column(name="id") @GeneratedValue(strategy=GenerationType.AUTO) private int id; @Column(name="id") private String name; @Column(name="surname") private String surname; @Id public int getId() { return id; } public void setId(int id) { this.id = id; } @Column(name="name") public String getName() { return name; } public void setName(String empName) { this.name = empName; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } } ng,它试​​图update换一行。有人请告诉我通过insert更新的正确方法


控制台日志

NamedQuery

旁边问题:我看到了很多关于使用Oct 02, 2014 8:57:44 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final} Oct 02, 2014 8:57:44 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {4.3.6.Final} Oct 02, 2014 8:57:44 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found Oct 02, 2014 8:57:44 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist Oct 02, 2014 8:57:44 PM org.hibernate.cfg.Configuration configure INFO: HHH000043: Configuring from resource: /hibernate.cfg.xml Oct 02, 2014 8:57:44 PM org.hibernate.cfg.Configuration getConfigurationInputStream INFO: HHH000040: Configuration resource: /hibernate.cfg.xml Oct 02, 2014 8:57:44 PM org.hibernate.internal.util.xml.DTDEntityResolver resolveEntity WARN: HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide! Oct 02, 2014 8:57:44 PM org.hibernate.cfg.Configuration doConfigure INFO: HHH000041: Configured SessionFactory: null Oct 02, 2014 8:57:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure WARN: HHH000402: Using Hibernate built-in connection pool (not for production use!) Oct 02, 2014 8:57:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://localhost:3306/hibernate] Oct 02, 2014 8:57:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000046: Connection properties: {user=root, password=****} Oct 02, 2014 8:57:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator INFO: HHH000006: Autocommit mode: false Oct 02, 2014 8:57:44 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure INFO: HHH000115: Hibernate connection pool size: 1 (min=1) Oct 02, 2014 8:57:44 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect Oct 02, 2014 8:57:45 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) Oct 02, 2014 8:57:45 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000228: Running hbm2ddl schema update Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000102: Fetching database metadata Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000396: Updating schema Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> INFO: HHH000261: Table found: hibernate.hib1 Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> INFO: HHH000037: Columns: [id, name, surname] Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> INFO: HHH000108: Foreign keys: [] Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.TableMetadata <init> INFO: HHH000126: Indexes: [primary] Oct 02, 2014 8:57:45 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: HHH000232: Schema update complete Hibernate: insert into hib1 (name, surname, id) values (?, ?, ?) Oct 02, 2014 8:57:46 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions WARN: SQL Error: 1048, SQLState: 23000 Oct 02, 2014 8:57:46 PM org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions ERROR: Column 'name' cannot be null Oct 02, 2014 8:57:46 PM org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release INFO: HHH000010: On release of batch it still contained JDBC statements Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:72) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:126) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:112) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:211) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:62) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3124) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3581) at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:104) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56) at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425) at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:177) at hibernate_tut_emp.CreateData.main(CreateData.java:28) Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'name' cannot be null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:526) at com.mysql.jdbc.Util.handleNewInstance(Util.java:377) at com.mysql.jdbc.Util.getInstance(Util.java:360) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:971) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823) at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:208) ... 13 more 的建议......使用此Session.createSQLQuery(String queryString)NamedQuery有什么好处?

1 个答案:

答案 0 :(得分:2)

您不必创建新员工并执行session.save(emp)更新。 你必须这样做:

updateQ .executeUpdate();