hql语句设置参数的问题,query.setEntity()

本文介绍了在使用Hibernate框架进行实体更新操作时遇到的问题及其解决方案。当尝试更新包含空引用实体的记录时,会触发错误“entityforparameterbindingcannotbenull”。文章提供了正确的处理方法,并分享了作者的一些个人经历。

有个问题困扰很久,一直没找出问题,今天准备在讨论区贴出来,寻求帮助,在整理问题的过程中,灵光一闪,好像忽然明白了问题所在。后来经过测试,确定无误。

犯错的具体经过就不一一敖述,怪不好意思的,怪自己不够聪明,思维僵化,总归一个字,笨。下面直接说问题根源

String hql = "update SysUser c set c.userStatus=:userStatus,c.userPass=:userPass,c.sysRole=:sysRole where c.userId=:userId";
   Query query = sessionFactory.getCurrentSession().createQuery(hql);
   query.setInteger("userStatus", user.getUserStatus());
   query.setString("userPass", user.getUserPass());
   query.setEntity("sysRole", user.getSysRole()); //关键点在这里 setEntity
   query.setLong("userId", user.getUserId());

 query.setEntity("sysRole", user.getSysRole());  当user.getSysRole()==null时,程序就会报错

报错提示为:entity for parameter binding cannot be null

如果必须要把user.getSysRole()设置为空,那怎么做呢?

query.setEntity("sysRole", null);或query.setEntity("sysRole", "");都报错,设置空字符串也是不行的,这里不能放String类型。直接按照sql语句的思路处理

String hql = "update SysUser c set ..省略..,c.sysRole='' where c.userId=:userId";

直接设置为空就好,虽然c.sysRole是对象类型,但这里可以按照sql语法来处理。

嘿嘿,就这样了。

端午节回家过节,结果在家吹风扇吹感冒了,哥们这强悍的身体,小风寒算啥,今天一早泡个热水脚,现在头也不晕了,眼也不花了。但终究是感冒,身体抵抗力下降了啊,运动少,还通宵。比尔盖茨年轻时虽然也通宵达旦的工作,但微软全公司的员工可都是免费办健身卡滴。

这几天想恢复正常健康的生活方式,便找出以前看过的一本书,网上找的《4点起床(最养生和高效的时间管理)》一书,作者把一天分为3个八小时,4-12点,12-20点,20点-凌晨4点,第一个八小时用来处理复杂度较高的工作,第二个八小时用来处理日常及思考未来,第三个八小时做自己喜欢的事,比如看书,陪家人,睡觉。以前尝试过这种生活方式,感觉很好,一天都充满精神,现在想重新拾起,给自己一个好的身体和状态。

转载于:https://my.oschina.net/li21808890/blog/272310

以下是对代码 `session = super.getHibernateTemplate().getSessionFactory().openSession(); String hgl = "from Prpcfee r where r.id.policyno='"+policyno+"!'"; Query query = session.createQuery(hql); list = query.list();` 的潜在问题分析: ### 1. 变量名拼写错误 代码中定义的 HQL 语句变量名为 `hgl`,但在创建查询对象时使用的变量名是 `hql`,这会导致 `hql` 未定义的错误。应该统一变量名,示例如下: ```java session = super.getHibernateTemplate().getSessionFactory().openSession(); String hql = "from Prpcfee r where r.id.policyno='"+policyno+"!'"; Query query = session.createQuery(hql); list = query.list(); ``` ### 2. SQL 注入风险 代码中直接将变量 `policyno` 拼接到 HQL 语句中,这会带来 SQL 注入的安全风险。恶意用户可以通过构造特殊的 `policyno` 值来改变原有的查询逻辑。应该使用参数化查询来避免这个问题,示例如下: ```java session = super.getHibernateTemplate().getSessionFactory().openSession(); String hql = "from Prpcfee r where r.id.policyno = :policyno"; Query query = session.createQuery(hql); query.setParameter("policyno", policyno); list = query.list(); ``` ### 3. 资源管理问题 代码中使用 `openSession()` 方法打开了一个新的 Session,但没有对其进行关闭操作。这可能会导致资源泄漏,特别是在高并发的情况下。应该在使用完 Session 后及时关闭,示例如下: ```java Session session = null; try { session = super.getHibernateTemplate().getSessionFactory().openSession(); String hql = "from Prpcfee r where r.id.policyno = :policyno"; Query query = session.createQuery(hql); query.setParameter("policyno", policyno); list = query.list(); } catch (Exception e) { e.printStackTrace(); } finally { if (session != null) { session.close(); } } ``` ### 4. 空指针异常风险 `super.getHibernateTemplate()` 或 `getSessionFactory()` 可能返回 `null`,这会导致 `NullPointerException`。在调用这些方法之前,应该进行空值检查。 ### 5. 性能问题 使用 `openSession()` 方法会创建一个新的 Session,每次执行查询都会创建和销毁 Session,这会带来一定的性能开销。可以考虑使用 `getCurrentSession()` 方法获取当前线程绑定的 Session,避免频繁创建和销毁 Session [^3]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值