线程超时
setTimeout( 2 )
写入L2缓存,但不要读取它们
setCacheMode( CacheMode.REFRESH )
为SessionFactory启用了查询缓存
setCacheable( true )
如果通过hibernate.use_sql_comments配置属性启用,则为生成的SQL添加注释
setComment( "+ INDEX(p idx_person_name)" );
设置参数
setParameter
获取一条数据
uniqueResult();
使用游标查询
try ( ScrollableResults scrollableResults = session.createQuery(
"select p " +
"from Person p " +
"where p.name like :name" )
.setParameter( "name", "J%" )
.scroll()
) {
while(scrollableResults.next()) {
Person person = (Person) scrollableResults.get()[0];
process(person);
}
}
由于这种形式使JDBC保持ResultSet
打开状态,因此应用程序应该ScrollableResults
通过调用其close()
方法来指示何时完成(因为它将继承,java.io.Closeable
因此ScrollableResults
可以使用try-with-resources块)。如果未被应用程序保持关闭,Hibernate将自动关闭当前事务结束时(提交或回滚)内部使用的底层资源(例如ResultSet
和)。PreparedStatement
ScrollableResults
,但是,最好ScrollableResults
明确地关闭它。
执行更新语句,可以在insert,update,delete语句中使用
executeUpdate();
使用多个根实体引用的简单查询
List<Object[]> persons = entityManager.createQuery(
"select distinct pr, ph " +
"from Person pr, Phone ph " +
"where ph.person = pr and ph is not null", Object[].class)
.getResultList();
这里要注意一个地方,当使用Object[].class为传入的对象时,createQuery方法会遍历所有对应的实体类,如上图所示,select语句中有两个对象,Person 和Phone 通过传入的Object[].class获取到了对应的Person.class和Phone.class并通过相应的实体获取到相应的参数进行对比判断从而查询出自己想要的值