As already discussed, automatic and transparent object/relational mapping is concerned with the management of object state.
This implies that the object state is available in memory, hence manipulating (using the SQL Data Manipulation Language
(DML) statements: INSERT
, UPDATE
, DELETE
) data directly in the database will not affect in-memory state. However, Hibernate provides methods for bulk SQL-style DML
statement execution which are performed through the Hibernate Query Language (HQL).
UPDATE
å DELETE
è¯å¥çè¯æ³ä¸ºï¼ ( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?
æå ç¹è¯´æï¼
å¨FROMåå¥ï¼from-clauseï¼ä¸ï¼FROMå ³é®åæ¯å¯éç
å¨FROMåå¥ï¼from-clauseï¼ä¸åªè½æä¸ä¸ªå®ä½åï¼å®å¯ä»¥æ¯å«åã妿å®ä½åæ¯å«åï¼é£ä¹ä»»ä½è¢«å¼ç¨ç屿§é½å¿ é¡»å 䏿¤å«åçåç¼ï¼å¦æä¸æ¯å«åï¼é£ä¹ä»»ä½æåç¼ç屿§å¼ç¨é½æ¯éæ³çã
No joins (either implicit or explicit) can be specified in a bulk HQL query. Sub-queries may be used in the where-clause; the subqueries, themselves, may contain joins.
æ´ä¸ªWHEREå奿¯å¯éçã
举个ä¾åï¼ä½¿ç¨Query.executeUpdate()
æ¹æ³æ§è¡ä¸ä¸ªHQL UPDATE
è¯å¥(ï¼ (æ¹æ³å½åæ¯æ¥æºäºJDBC's PreparedStatement.executeUpdate()
):
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlUpdate = "update Customer c set c.name = :newName where c.name = :oldName"; // or String hqlUpdate = "update Customer set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
HQL UPDATE
statements, by default do not effect the version or the timestamp property values for the affected entities; this is in keeping with the EJB3 specification. However, you can force Hibernate
to properly reset the version
or timestamp
property values through the use of a versioned update
. This is achieved by adding the VERSIONED
keyword after the UPDATE
keyword.
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName"; int updatedEntities = s.createQuery( hqlUpdate ) .setString( "newName", newName ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
注æï¼èªå®ä¹ççæ¬ç±»å(org.hibernate.usertype.UserVersionType
)ä¸å
许åupdate versioned
è¯å¥èç¨ã
æ§è¡ä¸ä¸ªHQL DELETE
ï¼åæ ·ä½¿ç¨ Query.executeUpdate()
æ¹æ³:
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer c where c.name = :oldName"; // or String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
ç±Query.executeUpdate()
æ¹æ³è¿åçæ´å
å¼è¡¨æäºåæ¤æä½å½±åçè®°å½æ°éã æ³¨æè¿ä¸ªæ°å¼å¯è½ä¸æ°æ®åºä¸è¢«ï¼æå䏿¡SQLè¯å¥ï¼å½±åäºçâè¡âæ°æå
³ï¼ä¹å¯è½æ²¡æãä¸ä¸ªå¤§æ¹éHQLæä½å¯è½å¯¼è´å¤æ¡å®é
çSQLè¯å¥è¢«æ§è¡ï¼
举个ä¾åï¼å¯¹joined-subclassæ å°æ¹å¼çç±»è¿è¡çæ¤ç±»æä½ãè¿ä¸ªè¿åå¼ä»£è¡¨äºå®é
被è¯å¥å½±åäºçè®°å½æ°éãå¨é£ä¸ªjoined-subclassçä¾åä¸ï¼
对ä¸ä¸ªåç±»çå é¤å®é
ä¸å¯è½ä¸ä»
ä»
ä¼å é¤åç±»æ å°å°ç表èä¸ä¼å½±åâæ ¹â表ï¼è¿æå¯è½å½±åä¸ä¹æç»§æ¿å
³ç³»çjoined-subclassæ å°æ¹å¼çåç±»ç表ã
INSERT
è¯å¥çä¼ªç æ¯: INSERT INTO EntityName properties_list select_statement
. è¦æ³¨æçæ¯:
åªæ¯æINSERT INTO ... SELECT ...å½¢å¼,䏿¯æINSERT INTO ... VALUES ...å½¢å¼.
properties_liståSQL INSERT
è¯å¥ä¸çåæ®µå®ä¹(column speficiation)
类似ã对åä¸ç»§æ¿æ æ å°çå®ä½èè¨ï¼åªæç´æ¥å®ä¹å¨ç»å®ç类级å«ç屿§æè½ç´æ¥å¨properties_listä¸ä½¿ç¨ãè¶
ç±»ç屿§ä¸è¢«æ¯æï¼åç±»ç屿§æ æä¹ãæ¢å¥è¯è¯´ï¼INSERT
天ç䏿¯æå¤æã
select_statementå¯ä»¥æ¯ä»»ä½åæ³çHQLéæ©æ¥è¯¢ï¼ä¸è¿è¦ä¿è¯è¿åç±»åå¿
é¡»åè¦æå
¥çç±»åå®å
¨å¹é
ãç®åï¼è¿ä¸æ£æ¥æ¯å¨æ¥è¯¢ç¼è¯çæ¶åè¿è¡çï¼è䏿¯æå®äº¤ç»æ°æ®åºã注æï¼å¨HibernateType
é´å¦æåªæ¯çä»·ï¼equivalentï¼èéç¸ç(equal)ï¼ä¼å¯¼è´é®é¢ãå®ä¹ä¸ºorg.hibernate.type.DateType
åorg.hibernate.type.TimestampType
çä¸¤ä¸ªå±æ§å¯è½ä¼äº§çç±»åä¸å¹é
é误ï¼è½ç¶æ°æ®åºçº§å¯è½ä¸å åºåæè
å¯ä»¥å¤çè¿ç§è½¬æ¢ã
对id屿§æ¥è¯´,insertè¯å¥ç»ä½ ä¸¤ä¸ªéæ©ãä½ å¯ä»¥æç¡®å°å¨properties_listè¡¨ä¸æå®id屿§ï¼è¿æ ·å®ç弿¯ä»å¯¹åºçselect表达å¼ä¸è·å¾ï¼ï¼æè
å¨properties_listä¸çç¥å®ï¼æ¤æ¶ä½¿ç¨çææï¼ãåä¸ç§éæ©åªæå½ä½¿ç¨å¨æ°æ®åºä¸çæå¼çid产ç卿¶æè½ä½¿ç¨ï¼å¦ææ¯âå
åâä¸è®¡ç®çç±»åçæå¨ï¼å¨è§£ææ¶ä¼æåºä¸ä¸ªå¼å¸¸ã注æï¼ä¸ºäºè¯´æè¿ä¸é®é¢ï¼æ°æ®åºäº§çå¼ççæå¨æ¯org.hibernate.id.SequenceGenerator
ï¼åå®çåç±»ï¼ï¼ä»¥åä»»ä½org.hibernate.id.PostInsertIdentifierGenerator
æ¥å£çå®ç°ãè¿å¿æå¼å¾æ³¨æçæå¤æ¯org.hibernate.id.TableHiLoGenerator
ï¼å®ä¸è½å¨æ¤ä½¿ç¨ï¼å ä¸ºå®æ²¡æå¾å°å
¶å¼çéå¾ã
对æ å°ä¸ºversion
æ timestamp
ç屿§æ¥è¯´ï¼insertè¯å¥ä¹ç»ä½ ä¸¤ä¸ªéæ©ï¼ä½ å¯ä»¥å¨properties_listè¡¨ä¸æå®ï¼æ¤æ¶å
¶å¼ä»å¯¹åºçselect表达å¼ä¸è·å¾ï¼ï¼æè
å¨properties_listä¸çç¥å®ï¼æ¤æ¶ï¼ä½¿ç¨å¨org.hibernate.type.VersionType
ä¸å®ä¹çseed value(ç§åå¼)
ï¼ã
æ§è¡HQL INSERT
è¯å¥çä¾åå¦ä¸ï¼
Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlInsert = "insert into DelinquentAccount (id, name) select c.id, c.name from Customer c where ..."; int createdEntities = s.createQuery( hqlInsert ) .executeUpdate(); tx.commit(); session.close();