我有一个包含集合的实体类:
@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查询获取set“files”。查询(使用Eclipse Link执行)
SELECT u.files FROM Directory u WHERE u.id = :id
返回String列表,但不返回Path列表作为结果。因此,如何通过Eclipse Link获取Path列表?此外,是否可以将“文件”作为单个结果?
感谢任何帮助。
答案 0 :(得分:1)
EclipseLink应该为此查询应用Converter。看起来像一个错误,请记录该问题的错误。
作为一种解决方法,您只需要自己应用转换,或者选择整个Directory对象并加入获取文件并从用户中提取它们。
答案 1 :(得分: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"
答案 2 :(得分:0)
引用JPA规范,select子句应该是
single_valued_path_expression | scalar_expression | aggregate_expression | identification_variable | OBJECT(identification_variable)| constructor_expression
多值字段不是那些。该查询无效。纠正它。