给出以下实体结构:
@Entity
public class Item {
@Id @GeneratedValue
private Long id;
@OneToMany
private Set<ItemEntry> itemEntries;
public Item() {
itemEntries = new HashSet<>();
}
// Getters and setters
}
@Entity
public class ItemEntry {
@Id @GeneratedValue
private Long id;
private String stringValue;
@ManyToOne
private Item item;
public Item() {}
// Getters and setters
}
这解析为数据库表ItemEntry,如下所示:
| id | stringValue | item_id |
我需要使用JPA环境中的Criteria API(持久性提供程序是Hibernate)和规范元模型来查询此数据库表。
该查询用于检索所有不同 Item
个对象,stringValue
就像%my%。请注意,匹配%my%的stringValue
可能会多次分配到Item
。
到目前为止我所拥有的是以下代码:
final CriteriaQuery<ItemEntry> itemEntryQuery = criteriaBuilder.createQuery(ItemEntry.class);
final Root<ItemEntry> itemEntryRoot = criteriaQuery.from(ItemEntry.class);
final Path<Item> selection = itemEntryRoot.get(ItemEntry_.item);
itemEntryQuery.select(selection).where(...).distinct(true);
编译器发出错误说明
The method select(Selection<? extends ItemEntry>) in the type CriteriaQuery<ItemEntry> is not applicable for the arguments (Path<Item>)
还有其他可能性来实现我想要的吗?此时,我无法使用SetJoin<Item, ItemEntry>
,因为我需要按stringValue
排序结果,这是不可能的,因为需要在不同查询的选择列表中显示项目。如果我使用SetJoin<Item, ItemEntry>
,则只有Item
的字段会出现在select子句中。
答案 0 :(得分:1)
在CriteriaQuery<T>
中,T
是查询结果的类型。您希望查询返回Items而不是ItemEntries,因此它应该是CriteriaQuery<Item>
。
请注意,我确实会避免对不基于多个条件的查询进行条件查询,并且不需要构建dynamicicall。简单的JPQL更简单易读:
select distinct item from ItemEntry entry
join entry.item item
where entry.stringValue like :param