HQL 多对多加入额外的列

HQL Many to Many JOIN with extra columns

我在 Hibernate 中与 额外的列 有一个多对多的关系,所以我有一个额外的 java class 模型和另一个 class 与主键...现在在 HQL 中我需要一个检索这些数据的查询,但我在 Join 条件下遇到问题。

这是我的第一个 class:

@Entity
@Table(name = "Firsts")
public class First {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private int id;
    @OneToMany(mappedBy = "primaryKey.second")
    private List<FirstsSeconds> seconds = new LinkedList<>();
    @Column(name="description")
    private String description;
    ...
}

第二个class:

@Entity
@Table(name="Seconds")
public class Second {
    @Id
    private String code;

    @OneToMany(mappedBy = "primaryKey.first")
    private List<FirtsSeconds> firsts = new LinkedList<>();

    ...
}

并且 table manyToMany 具有额外的列:

@Entity
@Table(name = "firsts_seconds")
@AssociationOverrides({ @AssociationOverride(name = "primaryKey.first", joinColumns = @JoinColumn(name = "id")),
        @AssociationOverride(name = "primaryKey.second", joinColumns = @JoinColumn(name = "code")) })
public class FirstsSeconds{

    @EmbeddedId
    private FirstsSecondsId primaryKey = new FirstsSecondsId();

    @Column(name = "extra", nullable = false)
    private String extra;

    ...
}

所以id class:

@Embeddable
public class FirstsSecondsId {

    @ManyToOne
    private First first;
    @ManyToOne
    private Second second;

    ...
}

最后为了获得 HQL 结果,我用我想要的字段创建了一个新的 class: public class 新对象

public CargoOrder(String firstDescription, String fsExtra) {
    this.firstDescription = firstDescription;
    this.fsExtra = fsExtra;
}
...

首先,我想要 FirstSecond 的 First 描述和额外内容,所以这是我使用 JOIN fr.seconds as fs:

的查询
@Query("SELECT new com.mypackage.NewObject("
        + "fr.description as firstDescription, fs.extra as fsExtra) "
        + "FROM First as fr"
        + "JOIN fr.seconds as fs")
public List<NewObject> findManyToMany();

但是我没有结果:(...在这种情况下我必须指定 where 条件?

@Query("SELECT new com.mypackage.NewObject("
        + "fr.description as firstDescription, fs.extra as fsExtra) "
        + "FROM First as fr"
        + "JOIN fr.seconds as fs WHERE fr.first = fs.primaryKey.first")
public List<NewObject> findManyToMany();

这不能在 JOIN fr.seconds as fs WHERE fr.first = fs.primaryKey.first...

上编译

亲切的问候。

已解决...在应用程序属性中使用 spring.jpa.show_sql = true 进行调试我看到连接条件中存在错误匹配,我映射了错误的键:

在第一个 class 中是 primaryKey.first(不是第二个):

@OneToMany(mappedBy = "primaryKey.first")
private List<FirstsSeconds> seconds = new LinkedList<>();

第二个 primaryKey.second(不是第一个):

@OneToMany(mappedBy = "primaryKey.second")
private List<FirstsSeconds> firsts = new LinkedList<>();