Java 使用JPA/QueryDSL获得类似Pivot的结果
我们在项目中使用JPA2、Spring数据和QueryDSL。我有以下表格和相关JPA实体:Java 使用JPA/QueryDSL获得类似Pivot的结果,java,sql,jpa,pivot,querydsl,Java,Sql,Jpa,Pivot,Querydsl,我们在项目中使用JPA2、Spring数据和QueryDSL。我有以下表格和相关JPA实体: table Person (id, ...) table Activity (id, type, ...) @Entity @Configurable public class Activity { @ElementCollection @CollectionTable(joinColumns = @JoinColumn(name = "ACTIVITY_ID")) @NotEm
table Person (id, ...)
table Activity (id, type, ...)
@Entity
@Configurable
public class Activity {
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "ACTIVITY_ID"))
@NotEmpty
@Valid
private Set<ActivityName> names = new HashSet<>();
table ActivityName(activity_id, name, ...)
@Embeddable
@Immutable
@Table(uniqueConstraints = @UniqueConstraint(columnNames = "NAME"))
public static class ActivityName { ... }
table ActivityLevel(person_id, activity_id, level)
@Entity
@Immutable
@Validated
public final class ActivityLevel{...}
我的问题:有没有JPA QL/QueryDSL方法可以通过one表达式/投影获得这样的结果?我已经有了一个多步骤的解决方案——选择活动名称和级别,使用Java8执行分组和求和。如果使用querydsl进行分组,则不会得到单级条目。反之亦然,在我的解决方案中,我必须执行其他几个步骤
如果只通过使用查询就可以做到这一点,那就太好了 纯JPA&QueryDsl仅适用于实体。 因此,您可以创建一个db视图来聚合您正在查找的数据,并将其映射到一个新实体,您可以简单地进行查询 另一个解决方案是使用QueryDsl的原生jpa查询支持。 见下半部分。您需要最低的段落(查询并投影到DTO中) 归结起来是:
- 通过指向db(模式)生成Q类(我不确定为什么需要它,但它在文档中)
- 使用com.mysema.query.jpa.sql.JPASQLQuery类构造查询
- 确保在列表方法中列出查询中所有必需的结果字段
- 创建一个DTOBean类,您可以将结果投影到该类
- 将结果投影到dto类
Person[Name] ActitiyName ActivityLevel ActitiyName ActivityLevel Sum
Bob running 0.7 dancing 0.1 0.8
Mary running 0.5 0.5