1,有时复杂查询时要使用到别名,
创建别名时,一定要使用
JoinType.LEFT_OUTER_JOIN
例如:
CriteriaHelper criteriaHelper = CriteriaHelper.getInstance(response.getCriteria());
criteriaHelper.createAlias("agentList", "agentList2", JoinType.LEFT_OUTER_JOIN);//,JoinType.LEFT_OUTER_JOIN 不能少
否则,当关联的中间表没有记录时,就查不到当前实体类记录
2,使用Restrictions.ne 或 not like时,
注意,当值为null,不会走上述流程,
解决方法:增加 is null的判断
criteriaHelper.nOTlike(Constant2.COLUMN_ACCEPT_AGENT_IDS, Constant2.agent_in_grab_prefix + agentId)
.or(Restrictions.ne("agentType", EGrabAgentType.RANDOM_AGENT.getType())
, Restrictions.isNull("agentList2.id")
, Restrictions.ne("agentList2.id", agentId));
3,如果对象是只读的,
该对象是persist 对象时,使用update,不会更新,
例外情况是:该实体类有多对多的成员变量,例如:
要更新 GrabOrder,GrabOrder中有成员变量:
hibernate 的三种状态:
detached——persistent——transient
evict() 实际上是把 persistent 变为detached
transient:add之前的状态,add之后,就是persistent态,
detached 脱管的(脱离管理的)
4,如何把只读对象变为可更新的
//解决抢单时,抢单订单无法更新的问题
this.grabOrderDao.setReadOnly(grabOrder, false);
原始方法是:
super.getCurrentSession().setReadOnly(entityOrProxy, readOnly);
5.Session is closed
原因可能有如下几种:
(1)检查方法是否在txManager 中进行了配置:
参考:
http://hw1287789687.iteye.com/blog/2221116
http://hw1287789687.iteye.com/blog/2247453