如何在JPA中编写多个join ?



我正在运行一个spring引导应用程序,JPA的行为非常不同,这取决于使用它的确切情况。当试图运行获取转换器类型异常问题时,我们已经创建了一个JPA查询。

这是我尝试的UHG表与其他表没有任何外键约束

@Entity
@Table("uhg")
public class UHG {
@Id
@Column(name="uhg_no")
private Integer uhgNo;
private String section;
private String area;
private String zip;
private String rwd;
// getter setter
}
@Entity
@Table("section")
public class Section {
@Id
@Column(name="id")
private Integer id;
private String name;
// getter setter
}
@Entity
@Table("area")
public class Area {
@Id
@Column(name="id")
private Integer identifier;
@ManyToOne
@JoinColumn(name="section_id",referencedColumnName = "id")
private Section section;
private String name;
//getter setter
}

@Repository
public interface UHGRepo extends JpaRepository<UHG, Integer> {
@Query("SELECT a.area, b.id FROM UHG a JOIN Section b ON b.name=a.section LEFT JOIN Area c ON c.name=a.area AND c.section.id=b.id WHERE a.section IS NOT NULL AND a.area IS NOT NULL AND c.identifier IS NULL AND a.zip='Ye12Y'")
List<Area> findAreaSection();
}

当调用findAreaSection()时,我们得到ConversionFailedException,没有找到能够从类型转换的转换器…

如果我使用List<Object[]>findAreaSection ();查询正在返回结果。

我认为在编写查询时可能存在问题,可能是我没有以正确的方式编写join。

您正在尝试将选择转换为您没有的另一个实体。您需要为此查询创建一个DTO(或POJO),并修改您的查询。

@Repository
public interface UHGRepo extends JpaRepository<UHG, Integer> {
@Query("SELECT new set.your.package.here.QueryResponse(a.area, b.id) FROM UHG a JOIN Section b ON b.name=a.section LEFT JOIN Area c ON c.name=a.area AND c.section.id=b.id WHERE a.section IS NOT NULL AND a.area IS NOT NULL AND c.identifier IS NULL AND a.zip='Ye12Y'")
List<QueryResponse> findAreaSection();
}

你将创建这个对象(在我的例子中是QueryResponse),这个对象应该有一个构造函数。您需要在构造函数中使用所需的数据类型设置参数。

更多信息在这里:https://www.baeldung.com/jpa-queries-custom-result-with-aggregation-functions

为什么不直接返回c呢?

@Query("SELECT Distinct c FROM UHG a JOIN Section b ON b.name=a.section LEFT JOIN Area c ON c.name=a.area AND c.section.id=b.id WHERE a.section IS NOT NULL AND a.area IS NOT NULL AND c.identifier IS NULL AND a.zip='Ye12Y'")
List<Area> findAreaSection();

您必须使用@nativeQuery,当您调用本机查询时,您可以直接在de方法上面编写sql查询

最新更新