hibernate 一对多update操作的hql语句怎么写?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hibernate 一对多update操作的hql语句怎么写?相关的知识,希望对你有一定的参考价值。

有个学生表 user_id, user_name, school_id
还有个学校表school_id, school_name
我先取得了school的持久化对象,然后执行下面的hql语句
String hql = "update user set u.userName = ' " + userName + " ' and u.school = ' " + school + " ' where u.userId = ' " + userId + " ' ";

然后后台输出的sql语句的部分是
school_id = 'com.campus.model.School@6e3b4c',

我的方法是不对的,哪位告诉我应该怎么更新学校的id
因为我不需要更新user的所有信息,所以用hql语句来更新指定的字段
错的原因是找到了,就是school是对象,而String hql是一个字符串,拼接字符串的时候school这个对象是自动调用了toString方法,转成字符串了。

解决了,
String hql = "update user u set u.userName = ? , u.userUpdatetime = ? , u.school = ? where u.userId = ?";
Session session = getSession();
session.beginTransaction();
Query query = session.createQuery(hql);
query.setString(0, userName );
query.setTimestamp(1, updatetime) ;
query.setParameter(2,school);
query.setInteger(3, userId);
query.executeUpdate();
session.getTransaction().commit();

可以用多表关联,在myeclipes中添加Hibernate支持后反向生成实体类文件,在实体类文件中该:学生对学校是多对一操作,在student.Java中的学校id关联去掉,添加school类型的实例和get和set,在student.hbm.xml中删除相关的学生id关联,添加相应的映射。而在school。java中,添加Set<Student> stus = new HashSet<Student>() 并且相应的get以及set,在school.hbm.xml中添加相应的映射。并且设置类型为save-update或者是all或者delete,然后再重新编译,这两个hbm。xml文件要跟相应的。class文件放在同一包中 参考技术A String hql = "update user set u.userName = ' " + userName + " ' and u.school.school_id = ' " + school + " ' where u.userId = ' " + userId + " ' ";
这样试试,还有你的那个'"+ school +"'是不知道是什么。。 你自己看看追问

User类的一个属性
private School school;
后来hql里的school是我根据id查一遍数据库取得的对象。

参考技术B 用update模板。

Hibernate学习笔记 — HQL查询

一、HQL的一对多查询

班级(1)->(多)学生

/**
	 * 实现Classes与Student的内连接
	 * 
	 * SELECT c.*,s.*
	 * from classes c INNER JOIN student s 
	 * where (c.cid=s.cid)
	 */
	@Test
	public void testInnerJoin()
		session = HibernateUtils.openSession();
		
		Query query = session.createQuery("from Classes c " +
				"inner join c.students s ");
		List list = query.list();//Object[]
		session.close();
	
	
	/**
	 * 迫切内连接
	 */
	@Test
	public void testInnerJoin_fetch()
		session = HibernateUtils.openSession();
		
		Query query = session.createQuery("from Classes c " +
				"inner join fetch c.students s ");
		List list = query.list();//Classes
		session.close();
	
	
	/**
	 * 左外连接
	 * SELECT c.*,s.*
	 * from classes c LEFT OUTER JOIN student s 
	 * on(s.cid=c.cid)
	 */
	@Test
	public void testLeftOutJoin()
		session = HibernateUtils.openSession();
		
		Query query = session.createQuery("from Classes c " +
				"left outer join c.students s ");
		List list = query.list();//Object[]
		session.close();
	
	/**
	 * 迫切左外连接
	 * 
	 */
	@Test
	public void testLeftOutJoin_fetch()
		session = HibernateUtils.openSession();
		
		Query query = session.createQuery("from Classes c " +
				"left outer join fetch c.students s ");
		List list = query.list();//Classes
		session.close();
	
	
	/**
	 * 要查询的属性来自两个持久化类
	 * 	注意:带构造函数的查询不能 与 带fetch的查询同时存在
	 * 使用 fetch:是希望带Classes
	 * 	
	 */
	@Test
	public void testQueryPropertyFromTwo()
		session = HibernateUtils.openSession();
		List<ClassStuView> classStuViews = session.createQuery("select new cn.cil.domain.ClassStuView(c.name,s.name) " +
				" from Classes c inner join c.students s").list();
		session.close();
	

二、HQL的多对多查询

学生(多)->(多)课程

/**
	 * 迫切内连接
	 *     
	 */
	@Test
	public void testInnerJoin_Fetch()
		Session session = sessionFactory.openSession();
		session.createQuery("from Student s inner join fetch s.courses c").list();
		session.close();
	
	
	/**
	 * 迫切左外连接
	 */
	@Test
	public void testLeftOuterJoin_Fetch()
		Session session = sessionFactory.openSession();
		session.createQuery("from Student s left outer join fetch s.courses c").list();
		session.close();
	

三、一对多与多对多结合

班级(1)->(多)学生->(多)课程

/**
	 * 查询所有的班级的所有的学生的所有的课程
	 */
	@Test
	public void testQuery1()
		Session session = HibernateUtils.openSession();
		List<Classes> classes = session.createQuery("from Classes c inner join " +
											"fetch c.students s inner join " +
											"fetch s.courses cc").list();
		session.close();
	
	
	@Test
	public void testQuery2()
		Session session = HibernateUtils.openSession();
		List<Student> classes = session.createQuery("from Student s inner join fetch s.classes c inner join fetch s.courses cc").list();
		session.close();
	

实用场景:

用户登录系统,判断该用户所拥有的权限,并进行显示权限范围内的菜单

根据username查用户根据用户查角色再根据角色查权限

createQuery("from Privilege p inner join fetch p.roles r inner join fetch r.users u where u.username=?")

当表与表之间的关系过于复杂的时候,就不能使用hibernate了,hql的书写会相当相当麻烦,可以采用视图来解决这一问题,使用JDBC拼SQL

以上是关于hibernate 一对多update操作的hql语句怎么写?的主要内容,如果未能解决你的问题,请参考以下文章

hibernate中session,HQL,持久化,一对多,多对一

郁闷了,非常简单的hibernate更新操作为啥就不执行

Hibernate5-一对多双向关联-左外连接-HQL

Hibernate5-一对多双向关联-迫切左外连接-HQL

Hibernate中Hql查询

hibernate 级联删除