在映射文件(.hbm.xml)中預定義 HQL 或 SQL 查詢語句,賦予名稱,業務代碼通過名稱調用,實現查詢邏輯與業務代碼分離,提升可維護性與可讀性。
<hibernate-mapping>
<class name="com.test.bean.Student" table="student" catalog="users">
<id name="id"><generator class="identity"/></id>
<property name="name"/>
<property name="age"/>
<property name="sex"/>
</class>
<query name="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</hibernate-mapping>
調用:session.getNamedQuery("findStudentByName")
<class name="com.test.bean.Student" ...>
...
<query name="findStudentByName">
<![CDATA[from Student where name = :name]]>
</query>
</class>
調用:session.getNamedQuery("com.test.bean.Student.findStudentByName")(需全限定名)
<sql-query name="findStudentByName">
<return alias="s" class="com.test.bean.Student"/>
<![CDATA[select {s.*} from student s where s.name = :name]]>
</sql-query>
{s.*}:占位符,自動展開實體所有映射列;<sql-query name="findStudentByName">
<return-scalar column="name" type="string"/>
<return-scalar column="age" type="integer"/>
<![CDATA[select s.name, s.age from student s where s.name = :name]]>
</sql-query>
調用返回:List<Object[]>,或配合 Transformers.aliasToBean(Student.class) 轉實體。
<、>、&)轉義,保持 SQL/HQL 原樣;:name 命名參數,防止 SQL 注入,支援類型安全;public List<Student> queryByName(String name) {
Session session = HibernateSessionFactory.getSession();
Query q = session.getNamedQuery("findStudentByName"); // 或全限定名
q.setString("name", name);
return q.list();
}
findBy[Condition]、countBy[Condition]、update[Entity]By[Condition]。