当前位置: 首页 > 知识库问答 >
问题:

带有子类的抽象集合中的JPA条件搜索属性

白学
2023-03-14

我正在使用Spring数据规范编写一个使用JPA标准API的标准查询。

    null

在数据库中,类层次结构是用一个连接的继承策略存储的,如下(5个表):

  • 特性(id+某些常用字段)
  • integer_spearchitecture(外键+INT值)
  • decimal_spearchitecture(外键+十进制值)
  • 字符串特性(外键+VARCHAR值)
  • boolean_spearchitecture(外键+TINYINT值)

我需要使用JPA标准API来搜索所有至少具有指定值的特性的东西。

SELECT DISTINCT thing.id
FROM   thing 
       LEFT OUTER JOIN thing_has_characteristic has_c 
                    ON ( has_c.thing_id = thing.id ) 
       LEFT OUTER JOIN characteristic c 
                    ON ( c.id = has_c.characteristic_id ) 
       LEFT OUTER JOIN integer_characteristic integer_c 
                    ON ( integer_c.characteristic_id = c.id ) 
       LEFT OUTER JOIN string_characteristic string_c 
                    ON ( string_c.characteristic_id = c.id ) 
       LEFT OUTER JOIN boolean_characteristic boolean_c 
                    ON ( boolean_c.characteristic_id = c.id ) 
       LEFT OUTER JOIN decimal_characteristic decimal_c 
                    ON ( decimal_c.characteristic_id = c.id ) 
WHERE  integer_c.value = "9694" 
        OR string_c.value = "9694"
        OR decimal_c.value = "9694" 
        OR boolean_c.value = "9694";
private Specification<Thing> buildSearchSpecificationByCharacteristicValue(String value) {

    return (Specification<Thing>) (root, query, builder) -> {

        SetJoin<Thing,IntegerCharacteristic> integers = root.<Thing,IntegerCharacteristic>joinSet("characteristics", JoinType.LEFT );
        Predicate isInteger;
        try{
            isInteger = builder.equal(integers.get("value"), Integer.parseInt(value));
        }catch(NumberFormatException e){
            isInteger = builder.disjunction();
        }

        SetJoin<Thing,StringCharacteristic> strings = root.<Thing,StringCharacteristic>joinSet("characteristics", JoinType.LEFT);
        Predicate isString = builder.equal(strings.get("value"), value);

        return builder.or(
            isInteger,
            isString
        );
    };
}
org.springframework.dao.InvalidDataAccessApiUsageException: 
Unable to locate Attribute  with the the given name [value] on this 
ManagedType [com.xxxxxxxx.common.domain.DomainObject];
 nested exception is java.lang.IllegalArgumentException: 
Unable to locate Attribute  with the the given name [value] 
on this ManagedType [com.xxxxxxxx.common.domain.DomainObject]

共有1个答案

白文彬
2023-03-14

好了,我找到了解决问题的办法:

下面是一个示例,其中只包含了整数类型的条件,但隐式地说明了如何对其他类型执行这些条件。

return (Specification<Thing>) (root, query, builder) -> {

    Path<Characteristic> characteristics = root.join("characteristics", JoinType.LEFT);

    query.distinct(true);

    Subquery<IntegerCharacteristic> integerSub = query.subquery(IntegerCharacteristic.class);
    Root integerRoot = integerSub.from(IntegerCharacteristic.class);
    integerSub.select(integerRoot);
    integerSub.where(builder.equal(integerRoot.get("value"),Integer.parseInt(value)));

    return builder.in(characteristics).value(integerSub);

};
 类似资料:
  • 我有:一个实体有一个的集合,每个阶段都有一个的集合。Stage项可以有几种类型,我在JPA/Hibernate中使用它们作为带有鉴别器列的继承策略。 我需要lucene查询返回在类型a的阶段项(类中的字段)中具有特定细节的请求。我无法让hibernate搜索查看子类中的字段。 因此这个lucene查询不起作用(返回0个结果): 但基于中的字段进行搜索有效:

  • 我在我的应用程序中使用Hibernate搜索。其中一个子集合映射为IndexeDemBedded。子对象有两个字段,一个是id,另一个是date(使用date resoultion到毫秒)。当我搜索ID=1(或某个值)并且date等于另一个值时,我会得到第一个和第二个匹配的所有情况的结果。我只想在同一个孩子中获得两个字段匹配的记录,但我在不同的孩子中获得匹配,结果会高得多。下面是代码片段 主类是用

  • 本文向大家介绍Javascript搜索集合中的对象键,包括了Javascript搜索集合中的对象键的使用技巧和注意事项,需要的朋友参考一下 JavaScript中的Set类提供了一个has方法来搜索给定set对象中的元素。如果要在集合中搜索对象,则需要提供对该对象的引用。具有不同内存地址的相同对象不视为相等。此方法可以如下使用- 示例 输出结果

  • 今天我读了关于ModelMapper的文章,它似乎很有趣,但我不确定它的正确用法。 我有一个类似这样的Spring项目:我有序列化所必需的模型类。我的REST控制器将DTO对象返回到前端。我的前端将DTO返回给我的控制器,然后我需要DTO中的模型对象将其写入数据库。 我有一个人类,它有一个属性,比如:

  • 显然,扩展了,是抽象的,继承是, 和 具有 其他原因 。 但生成的SQL是这样的: 在我期待的时候: 请注意 使用另一根- 使用子查询- 将lastName字段上移到主题 使用本机查询 使用实体图 是不能接受的。 我感兴趣的是可以在WHERE子句中直接声明和使用的东西(仅从CriteriaBuilder和/或单个Root生成,就像子句一样)(如果确实存在的话)。

  • 问题内容: 我创建了如下的Oracle Text索引: 然后,我可以执行以下操作: 但是,可以说我们在此表中还有另一列,例如,我想改为执行以下查询: 使用上述索引,Oracle将必须搜索包含的所有项目,然后检查所有。 理想情况下,我宁愿只使用来搜索项目,因此我想要这样的索引: 有点像普通索引,因此可以对每个进行单独的文本搜索。 有没有一种方法可以在Oracle中做这样的事情(如果很重要,我将使用1