HQL:处理特殊字符

时间:2014-10-14 11:35:29

标签: java sql hibernate hql

我正在尝试使用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]

如果有人可以帮助我实现特殊字符处理的通用解决方案吗?

1 个答案:

答案 0 :(得分:2)

你永远不应该使用连接来传递这样的动态参数。这不仅效率不高,而且不健壮(因为参数值中的单引号使查询无效)并且不安全,因为恶意用户可以传递更改查询语义的值(谷歌用于“SQL注入攻击”) “)。

相反,请使用参数:

Query query = session.createQuery(
    "from HotelMapping hm where hm.hotelID.hotelName = :hotelName");
query.setString("hotelName", hotelName);