【问题标题】:Select collections with HQL使用 HQL 选择集合
【发布时间】:2017-01-22 08:10:49
【问题描述】:

我有以下课程:

Person.java

class Person {
    String name;
    Set<Hotel> visitedHotels;
    String someOtherData;

    public Person() {}

    public Person(String name, Set<Hotel> visitedHotels) {
        this.name;
        this.visitedHotels = this.visitedHotels;
    }

    // getters & setters
}

Hotel.java

class Hotel {
    // some code 
}

出于安全原因,有时不应加载“someOtherData”。

所以我尝试了以下 HQL:

select new Person( p.name , elements(p.visitedHotels) ) from Person p

select new Person( p.name , hotels ) from Person p left join p.visitedHotels hotels

但它不起作用 - 错误:无法在 Person 类上找到适当的构造函数。

是否可以连同人名一起选择酒店集合?

【问题讨论】:

  • JPQL BNF 禁止在 SELECT 子句中使用多值字段,请参阅 JPA 规范

标签: java spring hibernate jpa hql


【解决方案1】:

看看带有集合映射的 Blaze-Persistence 实体视图。这可能正是您正在寻找的:https://persistence.blazebit.com/documentation/entity-view/manual/en_US/index.html#collection-mappings

允许有一个单独的 DTO,例如

@EntityView(Person.class)
interfae PersonView {
    String getName();
    Set<Hotel> getVisitedHotels();
}

Usage in the query like

CriteriaBuilder<PersonView> cb = entityViewManager.apply(
    EntityViewSetting.create(PersonView.class),
    criteriaBuilderFactory.create(Person.class)
);

List<PersonView> list = cb.getResultList();

创建一个类似的查询

SELECT person.name, visitedHotels_1 FROM Person person LEFT JOIN person.visitedHotels visitedHotels_1

由于您似乎将其用于可视化,我建议也将 Hotel 映射为实体视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多