HIBERNATE - JPA2 - H2 - 按键查询@ElementCollections HashMap

2023-12-04

我正在使用 hibernate-entitymanager 3.6.4.Final 和 h2 数据库 1.3.155

我正在使用 H2Dialect。

我在按 @ElementCollection 中的元素过滤记录时遇到问题。 这是我的实体

@Entity
public class Item {
  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @MapKeyColumn(name="name", length=50)
  @Column(name="value", length=100)
  protected Map<String, String> attributes;
  /*  etc.  */
}

这是我的查询:

Item item = em.createQuery("FROM Item i JOIN i.attributes a WHERE KEY(a)='myAttrName'").getSingleResult();

这是错误消息:

4971 [main] WARN org.hibernate.util.JDBCExceptionReporter - SQL Error: 90022, SQLState: 90022
4971 [main] ERROR org.hibernate.util.JDBCExceptionReporter - Function "KEY" not found; SQL statement:
Exception in thread "main" javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not execute query

这很奇怪,因为文档中提供了函数 KEY() 和 VALUE()here

我是否缺少一些配置? 任何想法 ?

提前致谢


我也有完全一样的问题。经过几个小时的处理这个问题,调试 Hibernate 源代码,并一遍又一遍地检查书籍和 JPA 2.0 规范中的示例后,我决定在 EclipseLink 中尝试一下。

因此,我创建了一个非常简单的示例:一名员工拥有电话号码地图,其中键是电话类型(家庭、办公室、手机),值是电话号码。

@ElementCollection(fetch=FetchType.EAGER)
@CollectionTable(name="emp_phone")
@MapKeyColumn(name="phone_type")
@Column(name="phone_num")
private Map<String, String> phoneNumbers;

我可以验证这是否与 EclipseLink 2.1 和 OpenJPA 2.1.0 完美配合,但在 Hibernate 3.5.3、3.6.1.、3.6.3 中失败

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
Root<Employee> employeeRoot = criteria.from(Employee.class);
criteria.select(employeeRoot);
MapJoin<Employee, String, String> phoneRoot = employeeRoot.joinMap("phoneNumbers");

criteria.where(builder.equal(phoneRoot.key(), "HOME"));

System.out.println(entityManager.createQuery(criteria).getResultList());

我想,如果 Criteria API 失败,也许我可以使用命名查询来完成。有趣的是,Hibernate 不支持 KEY、VALUE 或 ENTRY 关键字,因此查询被证​​明是格式错误的。

http://opensource.atlassian.com/projects/hibernate/browse/HHH-5396

这是运行的:

String query = "SELECT e FROM Employee e JOIN e.phoneNumbers p WHERE KEY(p) IN ('HOME')";
System.out.println(entityManager.createQuery(query, Employee.class).getResultList());

在 hibernate 中它会生成以下 SQL 查询:

   select
        employee0_.id as id0_,
        employee0_.name as name0_ 
    from
        Employee employee0_ 
    inner join
        emp_phone phonenumbe1_ 
            on employee0_.id=phonenumbe1_.Employee_id 
    where
        KEY(phonenumbe1_.phone_num) in (
            'HOME'
        )

这显然是畸形的。

同样,在 EclipseLink 和 OpenJPA 中,这是可行的。

因此,显然 Hibernate 一定出了问题。我已在 Hibernate Jira 问题跟踪器中提交了一个错误

https://hibernate.atlassian.net/browse/HHH-6103

并已在 Hibernate 用户论坛中发布了该问题

最后,我必须使用包含与地图相同条目的可嵌入对象集合来解决问题。我被迫在可嵌入中实现 equals 和 hasHCode 以满足相同的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HIBERNATE - JPA2 - H2 - 按键查询@ElementCollections HashMap 的相关文章

随机推荐

  • WP7 / Silverlight]在列表框中绑定远程图像,这样UI就不会阻塞

    场景 Windows Phone 7 Silverlight 我有一个 ListBox 我将其简化为以下 XAML
  • Swift:使用 UISearchController/Predicates 过滤结构数组

    想知道是否有人可以帮助我在 Swift 中使用谓词进行过滤 我有一个有点混乱的数据源 我用它来填充 UITableView 数据源是一个结构体数组 该结构体定义如下 struct Exercises let category String
  • Azure 搜索突出显示带双引号的短语

    我们有一个天蓝色的Web应用程序 其中有一个搜索框 当我们输入带双引号的文本 例如 应用程序服务 时 它会正确列出带有 应 用程序服务 的记录 但它不仅突出显示 应用程序服务 而且还突出显示 应用程序服务 以及 服务 如果单独找到它们 可以
  • Docker 容器(不是 Docker 镜像)可以移动吗?

    我在以下网站上找到了此信息Docker 网站 Docker 容器可以运行 启动 停止 移动和删除 据我所知 Docker Images 可以移动 而 Docker Containers 则不能 但上面的信息明显位于 Docker 容器 标题
  • 错误的欧几里得距离 H2O 计算 R

    我使用 H2O 和 R 来计算 2 个 data frames 之间的欧几里德距离 set seed 121 create the data df1 lt data frame matrix rnorm 1000 ncol 10 df2 l
  • before_create 仍然保存

    在一切之前我要感谢你的帮助 我有一个这样的模型 attr protected nil belongs to product belongs to user before create add ammount def carted produ
  • 对于嵌入式应用程序从 std::string 切换到 std::wstring?

    到目前为止 我一直在嵌入式系统 路由器 交换机 电信设备等 的 C 应用程序中使用 std string 对于下一个项目 我正在考虑从 std string 切换到 std wstring 以支持 Unicode 例如 这将允许最终用户在命
  • 使用 vbscript 隐藏打开指定 url 和指定浏览器的链接

    我想转换这个批处理命令 start msedge exe new window https www google com 到 vbscript 文件 这样我就可以隐藏地打开它 我试过这个 Set WshShell WScript Creat
  • Pdf 的字段应在 asp.net 中使用 itextsharp 保持可编辑状态

    我有一个可填写的pdf 其中我有几个文本框 我使用以下代码 itextsharp 填充这些字段 DataTable dt new DataTable String pdfPath1 Server MapPath pdfs transmitt
  • 大文字显得模糊

    我正在使用 SFML 1 6 制作一个小游戏 我需要显示一些文本 所以我使用sf String班级 问题是 当我将尺寸增加到 96pt 时 边缘显得有点模糊 不过 当我增加 Microsoft Word 中的文本大小时 它看起来非常干净并且
  • 如何用Python四舍五入到小数点后两位? [复制]

    这个问题在这里已经有答案了 我在这段代码的输出中得到了很多小数 华氏度到摄氏度转换器 我的代码目前如下所示 def main printC formeln typeHere def typeHere global Fahrenheit tr
  • 使用 bash 脚本将密钥代码发送到 Xorg + wine

    如何将密钥代码发送到在 wine 下运行的 linux 中当前运行的应用程序 为了简单起见 我希望它位于 bash 下 使用名为xvkbd 它应该存在于每个 Linux 发行版中 语法很简单 xvkbd text line of keyco
  • CGAffineTransform 连接:适当的转换顺序

    我知道 每当我们想要对一个点同时应用一系列变换时 我们必须指定与我们想要感知的相反方向的序列 如果我想翻译 T 然后旋转 R 一个点x我们需要以串联矩阵结束RT 那么每个点都变换为 RT x 苹果转型文档显示 CGAffineTransfo
  • gnuplot:在for循环中设置线条样式

    我必须在同一张图上绘制几条曲线 我必须使用 for 循环来做到这一点 我想用线绘制前两条曲线 用点绘制其他曲线 我可以用线绘制所有曲线或用点绘制所有曲线 但不能在同一个 for 循环中进行更改 这是我的代码的相关部分 set style l
  • 停止后台工作者

    我的应用程序使用后台工作人员在循环内执行一些工作 我拥有它 以便在每次循环迭代时 它检查取消挂起是否为真 如果是 则中断循环 一切正常 我的应用程序在完成循环的当前迭代后停止处理 问题是我认为后台工作人员仍在运行 如果我单击按钮再次开始处理
  • 在 Hibernate 中持久化 LinkedList

    我试图保留一个具有 LinkedList 属性的类 但似乎无法正确执行 这是我的代码和映射 import java util LinkedList public class Stuff implements java io Serializ
  • 强制刷新到 Observable.Buffer c#

    有没有办法强制 Observable Buffer 在缓冲时间结束之前刷新 在示例中 mSubscription mFluxObservable Buffer new TimeSpan 0 0 1 30 Subscribe o gt sav
  • App Store (iTunes Connect) 的 512x512 图像,Apple 会像在手机上那样进行圆角处理吗?

    将 iPhone 应用程序提交到 iTunes Connect 进行 AppStore 分发后 他们会要求提供 512x512 像素的图像 以下是提交位置旁边的内容 将在 App Store 上使用的应用程序图标的大版本 它必须至少为 72
  • 如何使用gekko估计FOPDT方程中的theta值?

    我正在尝试使用 GEKKO 来拟合某个数据集 使用 FOPDT 优化方法来估计 k tau 和 theta 我看到了使用 odeint 的示例https apmonitor com pdc index php Main FirstOrder
  • HIBERNATE - JPA2 - H2 - 按键查询@ElementCollections HashMap

    我正在使用 hibernate entitymanager 3 6 4 Final 和 h2 数据库 1 3 155 我正在使用 H2Dialect 我在按 ElementCollection 中的元素过滤记录时遇到问题 这是我的实体 En