Criteria API JPA Hibernate:外键选择不同

时间:2016-07-08 10:24:43

标签: hibernate criteria-api jpa-2.1

给出以下实体结构:

@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子句中。

1 个答案:

答案 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