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

时间:2013-04-23 12:34:56

标签: 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> properties = Maps.newHashMap();

    ...
}

这是我使用条件构建器的实现:

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();
}

我正在为每个属性进行额外的连接。没有多少属性和具有相同类型的资源具有相同的属性键。这在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=?

对于Oracle,我得到了这个:

select ...
from resource_table propertyre0_ 
where propertyre0_.entid<>230 and propertyre0_.resource_type=?

我的查询有什么问题吗?

OBS:差点忘了。 Hibernate版本是4.1.9.Final。

1 个答案:

答案 0 :(得分:0)

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