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<>();
我在 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<>();