【问题标题】:Can't get a collection using a JPQL query无法使用 JPQL 查询获取集合
【发布时间】:2025-12-15 22:15:02
【问题描述】:

我有一个包含集合的实体类:

@Entity(name = "Directory")
@Converters({@Converter(name = "PathConvert", converterClass = PathConvert.class)})
public class Directory {

   @Id
   protected String id;

   @ElementCollection
   @CollectionTable(name = "Directory_Files", joinColumns = @JoinColumn(name = "id"))
   @Convert("PathConvert")
   @Column(name = "file")
   protected Set<Path> files;

}

转换器PathConvert 是必需的,因为java.nio.file.Path 没有实现Serializable,因此不能直接存储在列中。它只是使用 toString() 将 Path 转换为 String 并使用 Paths.get(str) 将 String 转换回 Path。

现在我想通过 JPQL 查询获取设置的“文件”。查询(使用 Eclipse Link 执行)

SELECT u.files FROM Directory u WHERE u.id = :id

返回一个字符串列表,而不是一个路径列表作为结果。因此,如何使用 Eclipse Link 获得路径列表?此外,是否可以将“文件”作为单个结果获取?

感谢任何帮助。

【问题讨论】:

    标签: jpa entity eclipselink converter jpql


    【解决方案1】:

    EclipseLink 应该为此查询应用转换器。似乎是一个错误,请为该问题记录一个错误。

    作为一种解决方法,您只需要自己应用转换,或选择整个目录对象并加入获取文件并从用户中提取它们。

    【讨论】:

      【解决方案2】:

      引用 JPA 规范,select 子句应该是

      单值路径表达式 |标量表达式 | 聚合表达式 | 识别变量 |对象(标识变量)|构造函数表达式

      多值字段不是这些。查询无效。更正它。

      【讨论】:

      • 真的错了吗?执行查询时,Eclipse Link 不会打印任何异常。此外,我还使用 JPQL 查询(与初始问题中的查询相同的结构)检索一组字符串,并且它可以正常工作。
      • 我说明了 JPA 规范中的内容(所有人都可以看到),因此什么是可移植的。如果您真的是说“我在 EclipseLink 上运行它,EclipseLink 支持什么”,那么最好问一下(因为它不再是 JPA 问题)
      【解决方案3】:

      JPA 无法将列强制转换为对象,因为它不是映射类型。

      JPA 确实能够从 JPQL 内部调用构造函数,但我不确定这是否适用于您的情况,因为您没有直接使用构造函数。

      List result = em.createQuery("SELECT NEW example.EmpMenu(e.name, e.department.name) " +
          "FROM Project p JOIN p.employees e " +
          "ORDER BY e.name"
      

      【讨论】: