HHH-2772的解决方法(hibernate querydsl)

时间:2016-02-24 09:37:50

标签: java hibernate one-to-many querydsl hibernate-onetomany

我试图通过他们的foo属性执行查询来查找汽车。属性存储在不同的表中。

我有两个班级

@Embeddable
@Table(name = "PROPERTY")
public class Property {

  @Column(name = "type", nullable = false)
  private String type;

  @Column(name = "string_value", nullable = true)
  private String stringValue;

  ...
}


@Entity
@Table(name = "CAR")
public class Car {

  @Id
  ...
  private String id;

  @ElementCollection(fetch = FetchType.EAGER)
  @Fetch(FetchMode.SUBSELECT)
  @CollectionTable(name = "PROPERTY", joinColumns = @JoinColumn(name = "car_ID") )
  private Set<Property> properties = new HashSet<Property>();

  ...
}

我正在尝试执行查询

QueryDsl:

.from(car)
.leftJoin(car.properties, foo)
.on(foo.type.eq("foo"))
.where(predicate)

产生的HQL:

select 
  car
from 
  com....Car car
left join 
  car.properties as foo with foo.type = :a1
where 
  ...

由于:https://hibernate.atlassian.net/browse/HHH-2772

,这不起作用
  

在此之前,可以编写HQL:
  选择猫猫猫猫LEFT JOIN cat.kittens作为小猫与cats.owner =:所有者
  现在HQL引发了一个例外:
  org.hibernate.hql.ast.InvalidWithClauseException:with子句只能引用驱动表中的列
  解决方法是明确使用主键(ownerId):
  SELECT cat FROM Cat cat LEFT JOIN cat.kittens as kitten with kitten.owner.ownerId =:ownerId

问题在于我没有ownerId或所有者,因为它是一个元素集合。

如果我将元素集合转换为@oneToMany @manyToOne,则该属性不能再嵌入并且需要id。这不是一个选择。 (我无法定义复合ID(这是一项要求),我不想添加新列)

你推荐什么?
是否可以将Car或Car Id作为字段添加到可嵌入的类中? 我可以用不同的方式创建标准吗? 我对任何不需要更改数据库的解决方法感兴趣。 (休眠改变或确定)

谢谢

0 个答案:

没有答案