HQL多种查询方法

运行在junit测试类中的方法,以下只贴出来了具体的方法。
方法如下:	
@SuppressWarnings("unchecked")
	@Test
	public void testquery() {
		String name = "老王";
		Session session = HibernateUtil.openSession();
		Transaction transaction = session.beginTransaction();
		System.out.println(session);
		List<Student> students = session
				.createQuery("from Student s where s.name=:n")
				.setString("n", name).list();
		for (Student s : students) {
			System.out.println(s.toString());
		}
		transaction.commit();
		session.close();
	}

	// 查询某一个值 返回一个list
	@Test
	public void testName() {
		String name = "老王";
		Session session = HibernateUtil.openSession();
		Transaction transaction = session.beginTransaction();
		System.out.println(session);
		/*第一种
		 * 查询一个属性 List<String> strs = session
		 * .createQuery("select s.name from Student s where s.name=:n")
		 * .setString("n", name) .list(); for (String s : strs) {
		 * System.out.println(s.toString()); }
		 */

		// 查询两个属性 可以当场一个object数组来处理
		List strs = session
				.createQuery(
						"select s.name,s.age from Student s where s.name=:n")
				.setString("n", name).list();
		for (int i = 0; i < strs.size(); i++) {
			Object[] obj = (Object[]) strs.get(i);
			System.out.println(obj[0] + "==========" + obj[1]);
		}
		transaction.commit();
		session.close();
	}

	// 通过占位符赋值
	@Test
	public void testZhanwei() {
		String name = "老王";
		Session session = HibernateUtil.openSession();
		Transaction transaction = session.beginTransaction();
		Query query = session.createQuery("from Student s where s.name=?");
		query.setString(0, name);// 为占位符赋值
		List<Student> strs = query.list();// 得到list集合
		for (Student s : strs) {
			System.out.println(s.toString());
		}
		transaction.commit();
		session.close();
	}


	// hql多个属性查询 前提是必须在Student类中创建一个需要查询属性的构造函数
	@Test
	public void testObject() {
		Session session = HibernateUtil.openSession();
		Transaction t = session.beginTransaction();
		List list = session.createQuery(
				"select new Student(name,age) from Student ").list();
		for (int i = 0; i < list.size(); i++) {
			Student student = (Student) list.get(i);
			System.out.println(student.getName() + "============="
					+ student.getAge());
		}
		t.commit();
		session.close();
	}

注意:在最后一个查询中,需要在Student类中创建一个需要查询属性的构造函数,例如:
public Student(String name, Integer age) {
	super();
	this.name = name;
	this.age = age;
}

否则,会抛此异常:
          org.hibernate.hql.ast.QuerySyntaxException: Unable to locate appropriate constructor on class [cn.csdn.test.Student] [select new Student(name,age) from cn.csdn.test.Student ]
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54)
	at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47)
	at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82)
	at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:263)
	at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187)
	at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
	at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
	at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124)
	at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
	at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
	at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770)
	at cn.csdn.junit.StudentTest.testObject(StudentTest.java:118)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:597)
	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
	at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)



	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值