我正在使用Spring数据规范编写一个使用JPA标准API的标准查询。
在数据库中,类层次结构是用一个连接的继承策略存储的,如下(5个表):
我需要使用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]
好了,我找到了解决问题的办法:
下面是一个示例,其中只包含了整数类型的条件,但隐式地说明了如何对其他类型执行这些条件。
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