Java 无法在Oracle中搜索匹配的映射列(MapKeyColumn)

Java 无法在Oracle中搜索匹配的映射列(MapKeyColumn),java,oracle,hibernate,jpa,Java,Oracle,Hibernate,Jpa,我有这个实体,希望找到任何具有相同属性集的实体 @Entity public class PropertyResource { @ElementCollection @MapKeyColumn(name = "property_key") @Column(name = "property_value") @CollectionTable(name = "resource_properties") private Map<String, String

我有这个实体,希望找到任何具有相同属性集的实体

@Entity
public class PropertyResource {

    @ElementCollection
    @MapKeyColumn(name = "property_key")
    @Column(name = "property_value")
    @CollectionTable(name = "resource_properties")
    private Map<String, String> properties = Maps.newHashMap();

    ...
}
@实体
公共类属性资源{
@元素集合
@MapKeyColumn(name=“property\u key”)
@列(name=“property\u value”)
@CollectionTable(name=“资源\属性”)
私有映射属性=Maps.newHashMap();
...
}
这是我使用criteria builder的实现:

public List<PropertyResource> findDuplicateProperties(PropertyResource resource) {
    CriteriaBuilder builder = em.getCriteriaBuilder();
    CriteriaQuery<PropertyResource> query = builder.createQuery(PropertyResource.class);
    Root<PropertyResource> resourceRoot = query.from(PropertyResource.class);
    List<Predicate> clauses = Lists.newArrayList();
    for (Entry<String, String> entry : resource.getProperties().entrySet()) {
        MapJoin<PropertyResource, String, String> properties = resourceRoot.joinMap("properties", JoinType.INNER);
        clauses.add(builder.and(builder.equal(properties.key(), entry.getKey()), builder.equal(properties.value(), entry.getValue())));
    }
    if (!resource.isNew()) {
        clauses.add(builder.notEqual(resourceRoot.get("id"), resource.getID()));
    }
    clauses.add(builder.equal(resourceRoot.get("type"), resource.getType()));
    return em.createQuery(query.where(clauses.toArray(new Predicate[clauses.size()]))).getResultList();
}
公共列表查找重复属性(PropertyResource资源){
CriteriaBuilder=em.getCriteriaBuilder();
CriteriaQuery=builder.createQuery(PropertyResource.class);
Root resourceRoot=query.from(PropertyResource.class);
List子句=Lists.newArrayList();
对于(条目:resource.getProperties().entrySet()){
MapJoin properties=resourceRoot.joinMap(“properties”,JoinType.INNER);
add(builder.and(builder.equal(properties.key(),entry.getKey()),builder.equal(properties.value(),entry.getValue());
}
如果(!resource.isNew()){
add(builder.notEqual(resourceRoot.get(“id”),resource.getID());
}
add(builder.equal(resourceRoot.get(“type”)、resource.getType());
返回em.createQuery(query.where(子句.toArray(新谓词[子句.size()]))).getResultList();
}
我正在为每个属性进行额外的连接。相同类型的属性和资源没有多少具有相同的属性键。这在h2中非常有效,h2产生:

select ...
from resource_table propertyre0_ 
inner join resource_properties properties1_ on propertyre0_.entid=properties1_.PropertyResource_entid 
inner join resource_properties properties2_ on propertyre0_.entid=properties2_.PropertyResource_entid 
where properties1_.property_key=? and properties1_.property_value=? 
and properties2_.property_key=? and properties2_.property_value=? 
and propertyre0_.entid<>4 and propertyre0_.resource_type=?
选择。。。
从资源_表属性yre0_
propertyre0.entid=properties1.PropertyResource\u entid上的内部联接资源\u properties properties1\u
propertyre0.entid=properties2.PropertyResource\u entid上的内部联接资源\u properties properties2\u
其中properties1.property\u key=?和属性1。属性值=?
属性2_u.property_key=?和属性2_u.property_value=?
以及propertyre0_u0.entid4和propertyre0_0.resource_UType=?
但是,对于Oracle,我得到以下信息:

select ...
from resource_table propertyre0_ 
where propertyre0_.entid<>230 and propertyre0_.resource_type=?
选择。。。
从资源_表属性yre0_
其中propertyre0_u0.entid230和propertyre0_0.resource_UType=?
我的问题有什么不对吗


差点忘了。Hibernate版本为4.1.9。最终版本。

这是一个用户错误案例(请更换用户)。我的问题是发送到Oracle案例中的属性映射确实是空的。代码做了唯一正确的事情;它没有创建任何连接