hibernate 动态查询

2019-03-25 13:40|来源: 网路

我做得一个struts+hibernate的项目,有一个问题是这样的:student(学生持久化类),team(班级持久化类),academy(学院持久化类),student和team是一对多关系,team和Academy是一对多关系,student和Academy没有直接的关系。现在我想做一个动态查询,其中一段代码是这样的。


下面的代码很多,但是粗略看一下就行,不用一句一句的看
/**
* 根据条件查询
*/
public List byStudent(String sno,String sname,String classid,int academyid){

Criteria critera = getSession().createCriteria(Student.class);//里面是一个class对象,而不是HQL
if(sno!=null&&!sno.equals("")){//如果equals在前面的话,容易报 nullpoint 异常
critera.add(Restrictions.like("sno", sno,MatchMode.ANYWHERE));
//如果是进行模糊查询的话,就要加一个参数,MatchMode.ANYWHERE ,否则就不能进行模糊查询
}
if(sname!=null&&!sname.equals("")){
critera.add(Restrictions.like("sname", sname,MatchMode.ANYWHERE));
}
if(address!=null&&!address.equals("")){
critera.add(Restrictions.like("address", address,MatchMode.ANYWHERE));
}
if(classid!=0){
critera.add(Restrictions.eq("classes.cid",new Integer(classid)));
}
if(academyid!=0){
critera.add(Restrictions.like("academyid",new Integer(academyid));
}
return critera.list();
}

问题是这样的,那个academyid也是需要进行动态查询的,但是critera.add(Restrictions.eq("?",new Integer(academyid)));这里的问好我不知道该填写什么,请大家帮一下

问题补充:
别人贴出的代码都是截图,具体是怎样实现的?
问题补充:
public class Student implements java.io.Serializable {

	private String id;  			//hibernate主键id 学号
	private String name;			//学生姓名	
	private String psw;				//登录密码
       private Team team;				//所在班级
    private Grade grade;			//所在年级
    private Approve approve;		//学生是否通过素质拓展认证
    private ColumnOne columnOne;

问题补充:
public class Team implements java.io.Serializable {

	private String id;
	
	private String name;
	
	private Set<Student> students = new HashSet<Student>();
	
	private Academy academy;

问题补充:
public class Academy  implements java.io.Serializable {

	private String id;
	
	private String name;
	
	private Set<Admin> admins = new HashSet<Admin>();
	
	private Set<Team> teams = new HashSet<Team>();

问题补充:
上面的代码参数可能和下面的有一定的不一样,大家尝试着看吧
问题补充:
谢了,有点急。帮忙看一下
问题补充:
下面的代码很多,但是粗略看一下就行,不用一句一句的看 
/** 
* 根据条件查询 
*/ 
public List byStudent(String sno,String sname,String classid,int academyid){ 

Criteria critera = getSession().createCriteria(Student.class);//里面是一个class对象,而不是HQL 
if(sno!=null&&!sno.equals("")){//如果equals在前面的话,容易报 nullpoint 异常 
critera.add(Restrictions.like("sno", sno,MatchMode.ANYWHERE)); 
//如果是进行模糊查询的话,就要加一个参数,MatchMode.ANYWHERE ,否则就不能进行模糊查询 
} 
if(sname!=null&&!sname.equals("")){ 
critera.add(Restrictions.like("sname", sname,MatchMode.ANYWHERE)); 
} 
if(address!=null&&!address.equals("")){ 
critera.add(Restrictions.like("address", address,MatchMode.ANYWHERE)); 
} 
if(classid!=0){ 
critera.add(Restrictions.eq("classes.sid",new Integer(classid))); 
} 
if(academyid!=0){ 
critera.add(Restrictions.like("academyid",new Integer(academyid)); 
} 
return critera.list(); 
} 

问题补充:
全部的积分都压上了,帮一下吧
问题补充:
Criteria critera = getSession().createCriteria(Student.class);
if(classid!=0){    
        Criteria classes = critera.createCriteria("team");
        classes.add(Expression.eq("id", classid));
}
return critera.list();


你这是什么意思啊,没看明白,classes并没有和critera 关联上。能再详细一点么,加上点注释。
问题补充:
to yourgame 你的方法我尝试了,不行啊。还有别的办法没?谢了
critera.add(Restrictions.eq("team.academy.id",new Integer(academyid)));

问题补充:
javax.servlet.ServletException: org.hibernate.QueryException: could not resolve property: team.academy.id of: pojo.Student
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:545)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:486)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	utils.EncodingFilter.doFilter(EncodingFilter.java:25)


root cause 

org.hibernate.QueryException: could not resolve property: team.academy.id of: pojo.Student
	org.hibernate.persister.entity.AbstractPropertyMapping.throwPropertyException(AbstractPropertyMapping.java:43)
	org.hibernate.persister.entity.AbstractPropertyMapping.toColumns(AbstractPropertyMapping.java:63)
	org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:31)
	org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1257)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumns(CriteriaQueryTranslator.java:433)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.getColumnsUsingProjection(CriteriaQueryTranslator.java:393)
	org.hibernate.criterion.SimpleExpression.toSqlString(SimpleExpression.java:45)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.getWhereCondition(CriteriaQueryTranslator.java:333)
	org.hibernate.loader.criteria.CriteriaJoinWalker.<init>(CriteriaJoinWalker.java:82)
	org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:67)
	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1514)
	org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:283)
	dao.StudentDaoImpl.search(StudentDaoImpl.java:112)
	struts.action.StudentAction.search(StudentAction.java:93)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:280)
	org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:216)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:484)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:274)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1482)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:525)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	utils.EncodingFilter.doFilter(EncodingFilter.java:25)


就是这个错误,我试过了,只要是属性(team.academy.i)与student中的属性不定应就会有这种错误,
问题补充:
这是StudentDaoImpl的代码,你看一看
	public List search(String id,String name,String academyid,String teamid){
		List students = null;
		Session sess = HibernateSessionFactory.getSession();
		Transaction tran = sess.beginTransaction();
		Criteria critera = sess.createCriteria(Student.class);
		if(!"".equals(id)&&id!=null){
			critera.add(Restrictions.eq("id",id));
		}
		if(!"".equals(name)&&name!=null){
			critera.add(Restrictions.eq("name",name));
		}
		if(!"".equals(teamid)&&teamid!=null){
			critera.add(Restrictions.eq("team.id",teamid));
		}
		if(!"".equals(academyid)&&academyid!=null){
			critera.add(Restrictions.eq("team.academy.id",academyid));
		}
		students = critera.list();
		tran.commit();
		sess.close();
		return students;
	}

相关问答

更多
  • //分页 (当前页) public List findPage(final Class clazz,final int currentPage,final int pageSize) throws Exception { List list=(List)this.getHibernateTemplate().execute(new HibernateCallback(){ public Object doInHibernate(Session arg0) throws HibernateException, ...
  • Hibernate适用于大多数具有面向对象模型的应用程序。 所以你可以问:什么时候面向对象的模型是合适的? 我会说,最大的优势是开发人员的生产力。 查询性能本身通常比手工编码查询更差,因为它无法针对每个特定情况进行优化。 休眠通过使用缓存来很好地补偿这一点。 只写(大部分)系统不能从缓存中获得太多优势,甚至可能会降低性能(应该避免使用缓存)。 这些类型的系统通常不需要面向对象的模型,他们只是将数据推送到数据库中。 Hibernate is suitable for most of the applicati ...
  • 你看过Criteria查询了吗? 它是一种用于以编程方式构造查询和参数的Hibernate功能。 如果您的目的是查询符合所有这些条件的实体: prop1 =“A”和prop2.x = 3和prop2.y和prop3.get(i).type =“Circle” 支持关联查询 ,然后你可以做类似的事情 Criteria criteria = session.createCriteria(Model.class); criteria.add(Restrictions.eq("prop1", "A")); crit ...
  • HQL可以工作,cfquery中的基本SQL仍然可以正常工作。 Hibernate的优势在于不执行SUM()或AVG()等聚合函数,而是执行对象关系映射(ORM)。 HQL would work, basic SQL in cfquery would still work as well. The strength of Hibernate is not doing aggregated functions like SUM() or AVG(), but the Mapping of Object Rel ...
  • HQL与数据库无关,因此最好在Hibernate中使用HQL。 HQL is independent of database.So it is better to use HQL with hibernate.
  • 是的,您可以使用Hibernate 执行普通的SQL查询 。 不,你不需要单独的hbm.xml映射文件(除非你想将sql查询与其他文件分开,在这种情况下你可以这样做)。 您可以使用与命名HQL查询相同的方式映射命名的SQL查询。 您是否能够“利用缓存”取决于您通过“缓存”所了解的内容以及如何映射SQL查询; 不知道更多细节就无法回答。 所有这一切,你可能不需要求助于SQL查询; HQL功能非常强大,并且很有可能(假设存在适当的映射)将您的查询编写为HQL。 你能发布相关的映射/模式和你的SQL查询吗? Ye ...
  • 如果我相信API的这个文档,我会说在2.0版本中有命名查询。 Hibernate API文档 然而,它没有明确提及,我相信只是因为我在Google上找到了搜索“Hibernate 2.0文档”的链接,并且它与实际版本的文档不同,而且它在URL中提到了hibernate-2 。 If I believe this documentation of the API, I would say that named queries were there back in version 2.0. Hibernate ...
  • 据我所知,较新版本的hibernate不再支持hibernate配置文件中的 。 你可以删除它,而不是尝试 您的HibernateUtil静态块中的cfg.addAnnotatedClass(User.class) 。 另外,您可能需要考虑使用构建sessionFactory的最新方法,因为不推荐使用Configuration方式。 有关更多信息,请参阅本机引导部分。 As far as I remember, the newer version of hibern ...
  • 你可以使用Restrictions.in ie Criteria cr = session.createCriteria(Employee.class); List salaryList = new ArrayList(); salaryList.add(2000); salaryList.add(3000); criteria.add(Restrictions.in("salary", sa ...