Hibernate 允許直接編寫 SQL,通過 SQLQuery 接口執行,並支持實體映射別名 {entity.*} 自動映射列。示例:查詢年齡 > 20 的用戶。
<sql-query name="com.hb3.pack_01.model.User.SQLQueryUser">
<![CDATA[
select {user.*} from User user where user.age > :age
]]>
<return alias="user" class="com.hb3.pack_01.model.User"/>
</sql-query>
// 方式一:動態 SQL
String sql = "select {user.*} from User user where user.age > ?";
SQLQuery sqlQuery = session.createSQLQuery(sql);
sqlQuery.setParameter(0, 20);
sqlQuery.addEntity("user", User.class);
List users = sqlQuery.list();
// 方式二:命名查詢
Query query = session.getNamedQuery("com.hb3.pack_01.model.User.SQLQueryUser");
query.setInteger("age", 20);
List users = query.list();
在 <class> 節點下定義 <sql-insert>、<sql-update>、<sql-delete> 覆蓋 Hibernate 自動生成的語句。
<class name="User" table="user">
<id name="id" column="id"><generator class="native"/></id>
<property name="name"/>
<property name="age"/>
<sql-insert>INSERT INTO user VALUES (?, ?)</sql-insert>
<sql-update>UPDATE user SET name=?, age=? WHERE id=?</sql-update>
<sql-delete>DELETE FROM user WHERE id=?</sql-delete>
</class>
注意:參數順序必須與映射屬性聲明順序一致(主鍵通常在最後)。
User user = new User();
user.setName("yanfeng");
user.setAge(21);
Transaction tx = session.beginTransaction();
session.save(user); // 執行自定義 INSERT
tx.commit();
控制台輸出確認:Hibernate: insert into user (name, age) values (?, ?)