参数为左手边操作员LIKE JPQL

时间:2015-08-05 10:48:26

标签: java jpa eclipselink jpql

我正在尝试执行以下查询:(使用EclipseLink 2.5.2,MySQL 5.5)

em.createQuery("SELECT r FROM Region r WHERE (:pattern LIKE CONCAT(r.pattern, '%'))")
            .setParameter("pattern", "EU.FR.PR")
            .getResultList();

(背景:我正在尝试查找某个地区的所有超级区域。因此EU.FR.PR的超级区域将是EU.FREU。)

然而,这会引发以下异常:

  

java.lang.IllegalArgumentException:您试图设置一个值   类型为java.lang.String的类型,用于带有预期的参数模式   查询字符串

中的类java.lang.Boolean

Oracle docs状态

  

LIKE表达式确定通配符模式是否与字符串匹配。

我的Region课程中最相关的部分是:

@Entity
@NamedQuery(name="Region.findAll", query="SELECT r FROM Region r")
public class Region implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private int id;

    private String pattern;

    public Region() {
    }

    public String getPattern() {
        return this.pattern;
    }

    public void setPattern(String pattern) {
        this.pattern = pattern;
    }

}

以下是表中的一些示例数据:

+----+-------------+
| id | pattern     |
+----+-------------+
|  3 | EU          |
|  5 | EU.FR       |
|  6 | EU.FR.AL    |
| 13 | EU.FR.LU    |
| 14 | EU.FR.PR    |
| 15 | EU.FR.PR.BA |
| 16 | EU.FR.PR.CA |
| 17 | EU.FR.PR.PA |
| 18 | EU.FR.RH    |
| 19 | EU.FR.RH.TV |
| 20 | EU.FR.RO    |
+----+-------------+

那我为什么要传递一个布尔值呢?

直接将区域连接到查询("SELECT r FROM Region r WHERE ('" + theRegion + "' LIKE CONCAT(r.pattern, '%'))")会得到预期的结果,但这不是我想要在生产中做的事情。这是EclipseLink中的错误吗?

0 个答案:

没有答案