我正在尝试使用HQL
从数据库中获取值,但由于value包含特殊字符,因此会出现异常。我无法弄清楚原因。
以下是我正在尝试的代码:
HotelMapping hotelMapping = null;
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.getTransaction();
tx.begin();
String hotelName = "A Fisher's Inn Motel";
Query query = session.createQuery("from HotelMapping hm where hm.hotelID.hotelName='"+hotelName+"'");
HotelMapping mapping = query.uniqueResult();
}
tx.rollback();
sessionFactory.close();
pojos如下所示: 的 Hotel.java
public class Hotel{
String hotelName;
double price;
//getters and setters
}
HotelMapping.java
public class HotelMapping{
@OneToOne(cascade = CascadeType.ALL)
Hotel hoteID
String location;
}
查询字符串
Query query = session.createQuery("from HotelMapping hm where hm.hotelID.hotelName='"+hotelName+"'");
给出了以下异常:
Exception in thread "main" org.hibernate.QueryException: expecting ''', found '<EOF>' [from com.pb.model.HotelMapping hm where hm.hotelID.hotelName='A Fisher's Inn Motel']
我试图逃避撇号,但没有运气。我尝试设置查询参数,但我又得到了异常
query.setParameter("hotelName", "A Fisher's Inn Motel");
它说Exception in thread "main" org.hibernate.QueryParameterException: could not locate named parameter [hotelName]
如果有人可以帮助我实现特殊字符处理的通用解决方案吗?
答案 0 :(得分:2)
你永远不应该使用连接来传递这样的动态参数。这不仅效率不高,而且不健壮(因为参数值中的单引号使查询无效)并且不安全,因为恶意用户可以传递更改查询语义的值(谷歌用于“SQL注入攻击”) “)。
相反,请使用参数:
Query query = session.createQuery(
"from HotelMapping hm where hm.hotelID.hotelName = :hotelName");
query.setString("hotelName", hotelName);