无法使用JPQL查询获取集合

时间:2013-03-31 22:58:24

标签: jpa entity eclipselink converter jpql

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

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

感谢任何帮助。

3 个答案:

答案 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_pa​​th_expression | scalar_expression |   aggregate_expression |       identification_variable | OBJECT(identification_variable)| constructor_expression

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