我试图通过他们的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作为字段添加到可嵌入的类中?
我可以用不同的方式创建标准吗?
我对任何不需要更改数据库的解决方法感兴趣。 (休眠改变或确定)
谢谢