【问题标题】:Parametrize objectname in jpql query for postgresql在 jpql 查询中为 postgresql 参数化对象名
【发布时间】:2014-12-22 12:47:20
【问题描述】:

我在 PostgreSQL 中使用 JPA 并在创建 jpql 时遇到问题。

下面是我的模型代码

public static List<Jobseekers> search(String key, String keyvalue) {
        @SuppressWarnings("unchecked")
        List<Jobseekers> empList = JPA.em().createQuery("FROM Jobseekers WHERE :key LIKE :keyvalue").setParameter("key", key).setParameter("keyvalue", "%"+keyvalue+"%").getResultList();
       System.out.println("key is"+key);
        return empList;
    }

所以我的列名在查询中是动态的

创建的sql是这样的

select * from jobseekers where 'name' like '%akash%'

名字是关键

由于名称列名称中的撇号('),上述查询给出了一个空列表

我的问题是如何删除列 name('name') 中的撇号(') 以便我能得到正确的结果?

【问题讨论】:

  • 您的问题不在于如何转义撇号,您的问题是带有:key 的准备好的语句无法像处理值那样处理动态SQL。我不知道答案,但您应该更改标题并可能更改问题以反映这一点。
  • 也许this is helpful

标签: java sql postgresql jpa playframework-2.2


【解决方案1】:

您不能参数化对象名称。参数仅用于值。您需要在查询本身中包含key(这可能会为您打开 SQL 注入!)。

所以你需要这样做:

List<Jobseekers> empList = JPA.em().createQuery("FROM Jobseekers WHERE " + 
        key + " LIKE :keyvalue")
    .setParameter("keyvalue", "%"+keyvalue+"%")
    .getResultList();

另一种选择是使用条件 API 来构建查询,但这要复杂得多;而且我用的不多,所以不能举个例子。

【讨论】:

  • 在查询中连接某些内容时要小心,您可能会受到 sql 注入攻击。
  • @uaiHebert 这正是我在回答中提到这一点的原因。
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 2022-01-18
  • 2021-09-21
  • 1970-01-01
  • 2021-08-22
  • 2016-03-29
  • 2018-11-07
  • 2011-09-22
相关资源
最近更新 更多