Java 从不同的联接表中选择

Java 从不同的联接表中选择,java,hibernate,jpa,Java,Hibernate,Jpa,我正在构建一个通用的属性系统,在这个系统中,不同的实体可以将属性表示为“PropertyEntity”。这样的属性实体有一个键、一个值,并且知道它所附加到的实体的id。考虑一个“用户实体”,在其中它的属性的映射会是这样的: @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE) @JoinTable(name = "UserProperties", joinColumns = @JoinColumn(nam

我正在构建一个通用的属性系统,在这个系统中,不同的实体可以将属性表示为“PropertyEntity”。这样的属性实体有一个键、一个值,并且知道它所附加到的实体的id。考虑一个“用户实体”,在其中它的属性的映射会是这样的:

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
@JoinTable(name = "UserProperties",
        joinColumns = @JoinColumn(name = "parentId"),
        inverseJoinColumns = @JoinColumn(name = "id"))
private Map<String, PropertyEntity> properties;

其中,参数1是一组键,参数2是父类型的名称,如“com.domain.UserEntity”。这种方法显然是不好的,因为它完全破坏了每个实体对额外联接表的使用,并且需要通过它们的值对结果进行后期过滤。

Eclipselink hat类似概念的动态实体,但这是不可移植的扩展。与我们想要的目标类似,实现是不同的。您试图表达的意思是:从用户u中选择u,其中u.properties.propertyKey在?1中,u.properties.parentType=?2可能是。但是u.properties是一个映射,请参见上面的代码段,因此查询不能用这种方式表示。此外,它遗漏了要过滤某些属性值的部分,第二个参数现在是多余的,因为我们直接从目标实体中选择
SELECT p FROM PropertyEntity p WHERE p.propertyKey in(?1) AND p.parentType = ?2