如何在Hibernate中使用new()语法选择包含列表的部分对象

如何在Hibernate中使用new()语法选择包含列表的部分对象,hibernate,select,constructor,collections,Hibernate,Select,Constructor,Collections,在我的休眠系统中,我有一个类图片,其中包含一些简单数据、安装列表和一些(巨大的)二进制数据。安装列表是通过联接表实现的,因为它是一个多个关系,并且在安装端定义: @Entity public class Picture { @Id private long pictureId; private String mimeType; @Lob @Basic(fetch=FetchType.LAZY) // Don't load all data unless required

在我的休眠系统中,我有一个类图片,其中包含一些简单数据、安装列表和一些(巨大的)二进制数据。安装列表是通过联接表实现的,因为它是一个多个关系,并且在安装端定义:

@Entity
public class Picture {
  @Id
  private long pictureId;
  private String mimeType;
  @Lob
  @Basic(fetch=FetchType.LAZY) // Don't load all data unless required
  private byte[] picture;

  @ManyToMany(mappedBy= "images")
  private List<Installation> installations;

  /** This should be used only to load partial objects through PictureDao */
  public Picture(long pictureId, String mimeType, List<Installation> insts) {
    this.pictureId = pictureId;
    this.mimeType = mimeType;
    this.installations = insts;
  }
...
}
但它声称找不到构造函数。如果我没有在select中包含安装,该字段将变为null,而不是列表的延迟加载程序。我也尝试过加入p.installations,但它仍然找不到构造函数。没有安装清单,它工作得很好

有没有办法将集合放入我的部分选择

谢谢, -Lars

不能在构造函数表达式中使用集合值路径表达式。引用JPA 1.0规范:

4.8选择条款 SELECT子句表示查询 结果。可以使用多个值 从的SELECT子句返回 询问

SELECT子句可以包含一个或多个 以下更多元素:a 单量程变量或 范围为 在实体抽象模式类型上 单值路径表达式 聚合选择表达式,一个 构造函数表达式

SELECT子句具有以下内容 语法:

select_clause ::= SELECT [DISTINCT] select_expression {, select_expression}*
select_expression ::=
         single_valued_path_expression |
         aggregate_expression |
         identification_variable |
         OBJECT(identification_variable) |
         constructor_expression
constructor_expression ::=
         NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::= single_valued_path_expression | aggregate_expression
aggregate_expression ::=
         { AVG | MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) |
         COUNT ([DISTINCT] identification_variable | state_field_path_expression |
                   single_valued_association_path_expression)
JPA2.0为构造函数_项提供了更多的功能(请参阅),但仍然无法传递集合值路径表达式

Query q = em.createQuery("SELECT new Picture" +
  "(p.pictureId, p.mimeType, p.installations) " +
  " FROM Picture p WHERE p.pictureId = :id");
select_clause ::= SELECT [DISTINCT] select_expression {, select_expression}*
select_expression ::=
         single_valued_path_expression |
         aggregate_expression |
         identification_variable |
         OBJECT(identification_variable) |
         constructor_expression
constructor_expression ::=
         NEW constructor_name ( constructor_item {, constructor_item}* )
constructor_item ::= single_valued_path_expression | aggregate_expression
aggregate_expression ::=
         { AVG | MAX | MIN | SUM } ([DISTINCT] state_field_path_expression) |
         COUNT ([DISTINCT] identification_variable | state_field_path_expression |
                   single_valued_association_path_expression)