如何让hibernate返回某些字段,而select * 形式
比如做一个HQL:Queryquery=session.createQuery("fromProductVOasporderbyp.showtimedesc");因为前面...
比如做一个HQL:
Query query = session.createQuery("from ProductVO as p order by p.showtime desc");
因为前面不能制定单独有些返回的字段,所以后台生成的SQL变得十分长:
Hibernate: select pts0_.g_id as g_id__, pts0_.id as id__, pts0_.id as id0_, pts0_.name as name0_, pts0_.price as price0_, pts0_.showtime as showtime0_, pts0_.state as state0_, pts0_.description as descript6_0_, pts0_.img as img0_, pts0_.state_price
其实就是默认成了select *,我觉得这样是不是很耗费资源呢,有什么办法解决?
另外,在项目正式发布后,如何在后台显示中把Hibernate:这些生成的SQL不显示出来呢?就像log4j定义级别那样。
回复ballanfeng:很想具体了解下你写的方法,能不能写得再详细点.几个毫秒的性能提高很重要 展开
Query query = session.createQuery("from ProductVO as p order by p.showtime desc");
因为前面不能制定单独有些返回的字段,所以后台生成的SQL变得十分长:
Hibernate: select pts0_.g_id as g_id__, pts0_.id as id__, pts0_.id as id0_, pts0_.name as name0_, pts0_.price as price0_, pts0_.showtime as showtime0_, pts0_.state as state0_, pts0_.description as descript6_0_, pts0_.img as img0_, pts0_.state_price
其实就是默认成了select *,我觉得这样是不是很耗费资源呢,有什么办法解决?
另外,在项目正式发布后,如何在后台显示中把Hibernate:这些生成的SQL不显示出来呢?就像log4j定义级别那样。
回复ballanfeng:很想具体了解下你写的方法,能不能写得再详细点.几个毫秒的性能提高很重要 展开
展开全部
第一个问题.如果你是要查询所有的对象就只能这样.要是查询两个对象中个别的属性就要新建立一个BO类.要是只查询单个对象中的个别属性就可以像查询标准sql一样去查询.比如(select p.showtime from ProductVO as p order by p.showtime desc)
第二个问题.我记得在配置文件中有个类似这样的节点设置为true.默认是false就能显示出来sql<prop key="hibernate.show_sql">
//---------
ballanfeng你的方法不对.这样操作是对的.但是有细节错误.要用构造函数的.你写的不是构造函数.
查询的时候
select new Single(p.id,p.name) from ProductVO as p order by p.showtime dese
可以得到特定的值但是感觉这样意义不大
select new com.dto.CsContactDTO(cc.custContRoleOid,
co.name,
co.genderCd,
co.phone1Nbr,
co.phone1AreaCd,
cc.contactPriority,
cc.roleTypeCd,
co.titleDesc,
co.phone1ExtNbr)
from Contact co,CustomerContactRole cc
where co.contactOid=cc.contact.contactOid
and cc.customerOid=:customerOid
order by cc.roleTypeCd,cc.contactPriority
这样才能体现出意义来
第二个问题.我记得在配置文件中有个类似这样的节点设置为true.默认是false就能显示出来sql<prop key="hibernate.show_sql">
//---------
ballanfeng你的方法不对.这样操作是对的.但是有细节错误.要用构造函数的.你写的不是构造函数.
查询的时候
select new Single(p.id,p.name) from ProductVO as p order by p.showtime dese
可以得到特定的值但是感觉这样意义不大
select new com.dto.CsContactDTO(cc.custContRoleOid,
co.name,
co.genderCd,
co.phone1Nbr,
co.phone1AreaCd,
cc.contactPriority,
cc.roleTypeCd,
co.titleDesc,
co.phone1ExtNbr)
from Contact co,CustomerContactRole cc
where co.contactOid=cc.contact.contactOid
and cc.customerOid=:customerOid
order by cc.roleTypeCd,cc.contactPriority
这样才能体现出意义来
推荐于2016-04-22 · 知道合伙人数码行家
可以叫我表哥
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:25897
获赞数:1464978
2010年毕业于北京化工大学北方学院计算机科学与技术专业毕业,学士学位,工程电子技术行业4年从业经验。
向TA提问 私信TA
关注
展开全部
下面是两个方法 :
public List<Userinfo> findTest(Integer userid){
List<Userinfo> list = new ArrayList<Userinfo>();
try {
Transaction tx = getSession().beginTransaction();
Query query = getSession().createQuery("select username,uname from Userinfo where userid = ?");
query.setParameter(0, userid);//绑定参数
Iterator<Object[]> it = query.list().iterator();
while(it.hasNext()){
Object[] obj = it.next();
Userinfo user = new Userinfo();
user.setUsername(obj[0].toString());
user.setUname(obj[1].toString());
list.add(user);
}
tx.commit();
return list;
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
}
返回的是一个object数组。
如果查询多个属性,则返回一个对戏那个数组,并且数组中的每个元素类型与对应的属性类型相对应。这中方式显然很不合理,可以使用动态实例化查询。
动态查询:
public List<Userinfo> findTest1(Integer userid){
List<Userinfo> list ;
try {
Transaction tx = getSession().beginTransaction();
Query query = getSession().createQuery("select new Userinfo(username,uname,utime) from Userinfo where userid = ?");
query.setParameter(0, userid);//绑定参数
list = query.list();
tx.commit();
return list;
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
}
注意:查询语句里面的new Userinfo() 在实体类里面需要有对应的构造方法,这样返回的list集合里面放的就是userinfo对象了。
public List<Userinfo> findTest(Integer userid){
List<Userinfo> list = new ArrayList<Userinfo>();
try {
Transaction tx = getSession().beginTransaction();
Query query = getSession().createQuery("select username,uname from Userinfo where userid = ?");
query.setParameter(0, userid);//绑定参数
Iterator<Object[]> it = query.list().iterator();
while(it.hasNext()){
Object[] obj = it.next();
Userinfo user = new Userinfo();
user.setUsername(obj[0].toString());
user.setUname(obj[1].toString());
list.add(user);
}
tx.commit();
return list;
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
}
返回的是一个object数组。
如果查询多个属性,则返回一个对戏那个数组,并且数组中的每个元素类型与对应的属性类型相对应。这中方式显然很不合理,可以使用动态实例化查询。
动态查询:
public List<Userinfo> findTest1(Integer userid){
List<Userinfo> list ;
try {
Transaction tx = getSession().beginTransaction();
Query query = getSession().createQuery("select new Userinfo(username,uname,utime) from Userinfo where userid = ?");
query.setParameter(0, userid);//绑定参数
list = query.list();
tx.commit();
return list;
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw e;
}
}
注意:查询语句里面的new Userinfo() 在实体类里面需要有对应的构造方法,这样返回的list集合里面放的就是userinfo对象了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果你想要只让对象的部分属性在对象被读取时加载,可以使用属性延迟加载的方法。不过这么做很麻烦,类需要特殊处理。而且要确认表现层能打开Session以保证可以正常读取这个属性。
其实只要不是大字段之类的对象和关联表,没必要用这个延时加载功能。其实这么取并没有消耗多少资源(消耗的资源在现有条件下可以忽略不计,你需要为几个毫秒的提高进行优化吗),而且你可以设置缓存,以提高性能。
其实只要不是大字段之类的对象和关联表,没必要用这个延时加载功能。其实这么取并没有消耗多少资源(消耗的资源在现有条件下可以忽略不计,你需要为几个毫秒的提高进行优化吗),而且你可以设置缓存,以提高性能。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<property name="hibernate.show_sql">false</property>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
<property name="hibernate.show_sql">false</property>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询