Hibernate中Criteria的对象字段如何查询?
设置了hibernate关联映射.publicclassA{privateBb;privateStringaname;...}publicclassB{privateSt...
设置了hibernate关联映射.
public class A{
private B b;
private String aname;
...
}
public class B{
private String bname;
...
}
一般情况下:
Criteria c= sess.createCriteria(A.class)
c.add(Restrictions.like("aname","XXX");
c.list();
我想通过B类型的b属性 查询A的数据,用Criteria应该如何写?(设置了hibernate关联映射.)
Criteria c= sess.createCriteria(A.class)
c.add(Restrictions.like("b.bname","XXX");//这样写就报错.
c.list();
麻烦大家帮我瞅瞅. 先谢谢了. 展开
public class A{
private B b;
private String aname;
...
}
public class B{
private String bname;
...
}
一般情况下:
Criteria c= sess.createCriteria(A.class)
c.add(Restrictions.like("aname","XXX");
c.list();
我想通过B类型的b属性 查询A的数据,用Criteria应该如何写?(设置了hibernate关联映射.)
Criteria c= sess.createCriteria(A.class)
c.add(Restrictions.like("b.bname","XXX");//这样写就报错.
c.list();
麻烦大家帮我瞅瞅. 先谢谢了. 展开
2个回答
推荐于2016-01-19
展开全部
到了Hibernate3.0以后,关联关系的对象默认都是使用延迟加载,例如<one-to-many>时.但我在映射<one-to-one>,<many-to-one>关系时指定了lazy="true",但是在查询对象时,我只想查询一个对象,仍然会把这个对象所关联的<one-to-one>,<many-to-one>对象一起查询出来,这样造成了极大的性能浪费.在不指定lazy属性时,<many-to-one>所关联的对象反而会延迟加载,这让我大为困惑,还以为是Hibernate的bug.
在网上查找资料,说在为了延迟加载<one-to-one>,<many-to-one>所关联的对象,需要设置被关联的对象<class name="" lazy="true">,我也这样做了,但是仍然没有效果.
仔细阅读了Hibernate的手册,才发现原来要延迟加载<one-to-one>,<many-to-one>所关联的对象时,除了要指定lazy="true"外,还需要运行期字节码增强,而我省去了这一步,所以延迟加载没有效果.同时还发现在默认情况下,<one-to-one>,<many-to-one>的lazy属性是"proxy"而不是"true"!因此如果直接采用lazy的默认值,是可以延迟加载的.
总结一下:
<many-to-one>默认的属性是lazy="proxy",此时默认是会延迟加载的.在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果.
而<one-to-one>相对要复杂一点,延迟加载还要受到constrained属性的限制.constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,它通过<one-to-one>关联的实体可能存在,也可能不存在,这时在查询实体时,Hibernate总会发起一次查询检查<one-to-one>所关联的实体是否存在,而这时已经可以把one-to-one关联的实体查询出来了,因此在<one-to-one>关系中,如果constrained="false",总是会立即加载关联到的实体.
如果当constrained="true",且lazy="proxy"(默认),是可以延迟加载的.
如果当constrained="true",且lazy="true"时,需要经过运行期字节码增加,延迟加载才会奏效.
使用hibernate后,观念应该转变过来, 一个对象应该是完整, 所以没法返回一个只包含某几个属性(字段) 的对象。 例如,一个人,就不能只返回一个头, 还是手什么的
如果数据量过大, 当然还是有这个必要. 也可以做到, 但是返回的不会是对象,而是字段数组.
hibernate 管这叫投影 Criteria criteria=session.createCriteria(User.class);
ProjectionList proList = Projections.projectionList();//设置投影集合 proList.add(Projections.groupProperty("userName")); proList.add(Projections.groupProperty("password")); criteria.setProjection(proList);
最后返回的List是 Object[] , [0] = userName, [1] = password 如果你真的只用来查 userName,password, 那就小题大做了 我想直接取出view(String userName,String password)的形式,
即hql:select new view(userName,password) from ....
两种方法 1 属性的延迟载入
在hbm.xml的属性上加 lazy=true
2 轻量设计
单独设计一个类, 只包含 userName 和password
我的意思就是设计了一个类用来存放username和password,但是Criteria能返回这个bean类型的一个List吗?
再写一个xml啊, 没人规定一张表只能映射一次
轻量的employee映射
在网上查找资料,说在为了延迟加载<one-to-one>,<many-to-one>所关联的对象,需要设置被关联的对象<class name="" lazy="true">,我也这样做了,但是仍然没有效果.
仔细阅读了Hibernate的手册,才发现原来要延迟加载<one-to-one>,<many-to-one>所关联的对象时,除了要指定lazy="true"外,还需要运行期字节码增强,而我省去了这一步,所以延迟加载没有效果.同时还发现在默认情况下,<one-to-one>,<many-to-one>的lazy属性是"proxy"而不是"true"!因此如果直接采用lazy的默认值,是可以延迟加载的.
总结一下:
<many-to-one>默认的属性是lazy="proxy",此时默认是会延迟加载的.在指定了lazy="true"之后,必须要经过运行期字节码增加,延迟加载才有效果.
而<one-to-one>相对要复杂一点,延迟加载还要受到constrained属性的限制.constrained="false"时表明实体和被关联到的实体的约束不是强制的,即存在一个实体时,它通过<one-to-one>关联的实体可能存在,也可能不存在,这时在查询实体时,Hibernate总会发起一次查询检查<one-to-one>所关联的实体是否存在,而这时已经可以把one-to-one关联的实体查询出来了,因此在<one-to-one>关系中,如果constrained="false",总是会立即加载关联到的实体.
如果当constrained="true",且lazy="proxy"(默认),是可以延迟加载的.
如果当constrained="true",且lazy="true"时,需要经过运行期字节码增加,延迟加载才会奏效.
使用hibernate后,观念应该转变过来, 一个对象应该是完整, 所以没法返回一个只包含某几个属性(字段) 的对象。 例如,一个人,就不能只返回一个头, 还是手什么的
如果数据量过大, 当然还是有这个必要. 也可以做到, 但是返回的不会是对象,而是字段数组.
hibernate 管这叫投影 Criteria criteria=session.createCriteria(User.class);
ProjectionList proList = Projections.projectionList();//设置投影集合 proList.add(Projections.groupProperty("userName")); proList.add(Projections.groupProperty("password")); criteria.setProjection(proList);
最后返回的List是 Object[] , [0] = userName, [1] = password 如果你真的只用来查 userName,password, 那就小题大做了 我想直接取出view(String userName,String password)的形式,
即hql:select new view(userName,password) from ....
两种方法 1 属性的延迟载入
在hbm.xml的属性上加 lazy=true
2 轻量设计
单独设计一个类, 只包含 userName 和password
我的意思就是设计了一个类用来存放username和password,但是Criteria能返回这个bean类型的一个List吗?
再写一个xml啊, 没人规定一张表只能映射一次
轻量的employee映射
2013-05-15
展开全部
你应该用"A.b.bname",这样应该可以!用A的属性 b 再是 b的属性
--------------------------------------------------------------------------------
SHINE_GE�0�3
<many-to-one name="cstCustomer" class="entity.CstCustomer" fetch="select">
<column name="lst_cust_id" not-null="true" />
</many-to-one>
Session session=super.getSession();
Criteria c=session.createCriteria(CstLost.class);
CstLost obj=page.getObj();
if(null!=obj&&null!=obj.getCstCustomer())
{
if(null!=obj.getCstCustomer().getCustName()&&!"".equals(obj.getCstCustomer().getCustName()))
c.add(Restrictions.like("cstCustomer.custName",obj.getCstCustomer().getCustName(),MatchMode.ANYWHERE));
}
c.addOrder(Order.asc("lstStatus"));
if(null!=page.getOrderBy()&&!"".equals(page.getOrderBy()))
c.addOrder(Order.asc(page.getOrderBy()));
return super.packing(c, page);
--------------------------------------------------------------------------------
SHINE_GE�0�3
<many-to-one name="cstCustomer" class="entity.CstCustomer" fetch="select">
<column name="lst_cust_id" not-null="true" />
</many-to-one>
Session session=super.getSession();
Criteria c=session.createCriteria(CstLost.class);
CstLost obj=page.getObj();
if(null!=obj&&null!=obj.getCstCustomer())
{
if(null!=obj.getCstCustomer().getCustName()&&!"".equals(obj.getCstCustomer().getCustName()))
c.add(Restrictions.like("cstCustomer.custName",obj.getCstCustomer().getCustName(),MatchMode.ANYWHERE));
}
c.addOrder(Order.asc("lstStatus"));
if(null!=page.getOrderBy()&&!"".equals(page.getOrderBy()))
c.addOrder(Order.asc(page.getOrderBy()));
return super.packing(c, page);
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询