how2j.cn

使用Criteria进行数据查询。
与HQL和SQL的区别是Criteria 完全是 面向对象的方式在进行数据查询,将不再看到有sql语句的痕迹

相关下载
文件名 文件大小
hibernate.rar 6m
使用站长秘制下载工具
步骤 1 : 先运行,看到效果,再学习   
步骤 2 : 模仿和排错   
步骤 3 : 先看用Criteria 查询的效果   
步骤 4 : 使用Criteria,根据name进行模糊查询   

步骤 1 :

先运行,看到效果,再学习

老规矩,先下载右上角的可运行项目,配置运行起来,确认可用之后,再学习做了哪些步骤以达到这样的效果。
步骤 2 :

模仿和排错

在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。
模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。
采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

推荐使用diffmerge软件,进行文件夹比较。把你自己做的项目文件夹,和我的可运行项目文件夹进行比较。
这个软件很牛逼的,可以知道文件夹里哪两个文件不对,并且很明显地标记出来
这里提供了绿色安装和使用教程:diffmerge 下载和使用教程
步骤 3 :

先看用Criteria 查询的效果

和使用HQL 进行查询得到的结果一样
先看用Criteria 查询的效果
步骤 4 :

使用Criteria,根据name进行模糊查询

使用Criteria 查询数据
1. 通过session的createCriteria创建一个Criteria 对象
2. Criteria.add 增加约束。 在本例中增加一个对name的模糊查询(like)
3. 调用list()方法返回查询结果的集合


除此之外,Criteria 还可以很方便的进行进行分页查询获取总数
package com.how2java.test; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.criterion.Restrictions; import com.how2java.pojo.Product; public class TestHibernate { public static void main(String[] args) { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = sf.openSession(); s.beginTransaction(); String name = "iphone"; Criteria c= s.createCriteria(Product.class); c.add(Restrictions.like("name", "%"+name+"%")); List<Product> ps = c.list(); for (Product p : ps) { System.out.println(p.getName()); } s.getTransaction().commit(); s.close(); sf.close(); } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2017-04-17 如何通过Criteria查询数量呢(需要指定条件)
tonglee
<many-to-one name="section" class="SectionBean" column="topic_sectionId"/> 这样一个多对一,但我现在需要查询指定sectionId的数据的数量,设定topic_sectionId为条件在运行时会提示找不到could not resolve property: topic_sectionId of: com.tonglee.bean.TopicBean 我是需要在bean中再添加sectionId这个参数吗?




10 个答案

how2j 答案时间:2017-04-21
get出来的对象,就是持久状态的。 请先不要修改太多代码,把我的教材稍微完整地过一遍,然后再根据自己的需求来修改,切忌一来就东改西改,很容易触到自己不知道的雷,这种学习方式效率并不高。 先走通一遍,然后再改,好吗?

tonglee 答案时间:2017-04-20
抱歉,因为全部改成hql或者sql了,贴不出完整代码,这个就是我当时的思路吧。或许想着提高重用性反而降低了效率?!

how2j 答案时间:2017-04-20
请提供修改部分的代码,不然我们讨论的准确性很差

tonglee 答案时间:2017-04-19
我是通过section的get方法查询id获取的(也是新建一个session 的方式查询),这样不算持久是吗。 好吧,我知道怎样解决了,我需要在当前session中进行获取才可以操作,但是通过其他类的方法获取或者直接传入是不允许的,是不是可以这么理解

how2j 答案时间:2017-04-19
根据提示来说,你是update了一个瞬时对象,正确的做法应该是先通过id获取这个对象,然后根据页面传递过来的参数修改了这个对象的属性之后,在通过session去update这个对象,而不是直接new一个对象。 关于hibernate对象状态的知识点请参考: http://how2j.cn/k/hibernate/hibernate-status/53.html

tonglee 答案时间:2017-04-18
好吧,就是我是毕业设计做一个小型bbs,section是版块实例,topic是主题数据实例,每一个topic都有一个外键指向sectionId,现在我是要查询表中的数据(因为之前用jdbc写好了,现在想用框架改一下,也在这个过程中学习),但查询时都会提示需要save,就是报上面的错误,我不知道该如何解决。 然后我现在用hql是可以查询了,但是在用到session的update方法时也会提示同样的错误,save the transient instance before flushing: com.tonglee.bean.SectionBean

how2j 答案时间:2017-04-18
你是熟悉这几个类之间的关系的,但是我不知道呢。 请先介绍下他们之间的关系,以及含义,不然我看着也觉得头大呢

tonglee 答案时间:2017-04-17
抱歉,我不应该急着问的,上面的问题我通过save解决了这个报错,但并没有解决实际问题,一个save后导致插入数据了,二个查询结果也并不正确呢,查询到的结果为0,而实际上我数据库中满足条件的结果有两条的,我将控制台显示的代码复制到sql运行也是正确的,请问这样该怎么解决呢

tonglee 答案时间:2017-04-17
上面的问题我通过传入相应对象是可以解决的,但依然无法查询到结果。 通过百度我看到有让设置cascade="all"或者save-update,persist;然而并没有成功。 并且我现在是查询而网上大多数查到的是插入。 关键代码: List<TopicBean> list = s.createCriteria(TopicBean.class).add(Restrictions.eq("section", SectionGet.getSection(0))).list(); SectionGet.getSection(0):SectionBean section = (SectionBean)s.get(SectionBean.class, id); 报错: org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing

tonglee 答案时间:2017-04-17
代码一:
List<TopicBean> list = s.createCriteria(TopicBean.class).add(Restrictions.eq("topic_sectionId", sectionId)).add(Restrictions.eq("topic_isTop", true)).list();
代码二:
int num = (int)s.createCriteria(TopicBean.class).setProjection(Projections.rowCount()).add(Restrictions.eq("topic_sectionId", sectionId)).uniqueResult();
都是报上面的错误。




答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到








提问之前请登陆
关于 JAVA 框架-Hibernate-查询-Criteria 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 389538688
站长会在每个工作日早上尽量回答提问(如果有漏掉没有回答的,请进群提醒一下)
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
站长是玻璃心,提问的时候请语气温柔些 kiss~
截止2017-5-19日累计提问 1638个,站长回答了 1546个
截止2017-8-15日累计提问 2788个,站长回答了 2544个

上传截图