Java 使用带Spring的QueryDSL进行一对多投影
我正在尝试在SpringBoot中使用QueryDSL,它工作得很好,直到我遇到一个我找不到答案的问题。假设我有以下结构:Java 使用带Spring的QueryDSL进行一对多投影,java,jpa,querydsl,Java,Jpa,Querydsl,我正在尝试在SpringBoot中使用QueryDSL,它工作得很好,直到我遇到一个我找不到答案的问题。假设我有以下结构: +-------+ +----------+ +-------+ | foo | | foo_bar | | bar | +-------+ +----------+ +-------+ | id | -------->| foo_id |
+-------+ +----------+ +-------+
| foo | | foo_bar | | bar |
+-------+ +----------+ +-------+
| id | -------->| foo_id | +- | id |
| name | | bar_id |<------| | name |
+-------+ | position | +-------+
+----------+
FooBar.class
@Entity
@Table(name = "foo_bar")
public class AlbumView{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private int position;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "foo_id")
private Foo foo;
@ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY)
@JoinColumn(name = "bar_id")
private Bar bar;
// Getters and Setters
}
酒吧
@Entity
@Table(name = "bar")
public class Bar{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
// Relations
@OneToMany(fetch = FetchType.LAZY, mappedBy = "bar")
private List<FooBar> fooBars;
// Getters and Setters
}
提前谢谢 只是一个随机猜测:必须尝试使用
foo.fooBars.any().position
?
@Entity
@Table(name = "bar")
public class Bar{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 100)
private String name;
// Relations
@OneToMany(fetch = FetchType.LAZY, mappedBy = "bar")
private List<FooBar> fooBars;
// Getters and Setters
}
JPQLQuery query = new JPAQuery(entityManager);
QFoo foo = QFoo.foo;
QFooBar fooBar = QFooBar.fooBar;
return query.from(foo)
.join(foo.fooBars, fooBar).on(fooBar.bar.id.eq((long)1))
.list(Projections.bean(Foo.class,
foo.id,
foo.name,
Projections.bean(FooBar.class,
???
// foo.fooBars.position can't be used because fooBars is an array
// foo.fooBars.get(0).position can't be used because i throws NullPointerException
).as("fooBars")
)
);