我正在尝试执行以下查询:(使用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.FR
和EU
。)
然而,这会引发以下异常:
java.lang.IllegalArgumentException:您试图设置一个值 类型为java.lang.String的类型,用于带有预期的参数模式 查询字符串
中的类java.lang.Boolean
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中的错误吗?