0

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

@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 获得路径列表?此外,是否可以将“文件”作为单个结果获取?

任何帮助表示赞赏。

4

3 回答 3

1

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

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

于 2013-04-01T13:46:13.710 回答
0

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"
于 2013-04-01T06:18:35.670 回答
0

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

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

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

于 2013-04-01T06:29:31.577 回答