Подтвердить что ты не робот

Объединение двух элементов таблицы в Spring Data JPA

Я хочу написать запрос типа Select * from A a left join B b on a.id=b.id, Я новичок в Spring Data JPA. Я не знаю, как писать объекты для запроса Join.

@Entity
@Table(name = "Release_date_type")
public class ReleaseDateType {

    @Id
    @GeneratedValue(strategy=GenerationType.TABLE)
    private Integer release_date_type_id;
    @Column
    private Integer sort_order;
    @Column
    private String description;
    @Column
    private String data_source_type;
    @Column(nullable = true) 
    private Integer media_Id;
    @Column
    private String source_system;
    @Column
    private String update_Name;
    @Column
    private Date update_Date;
    @Column
    private String create_Name;
    @Column
    private Date create_Date;
    @Column
    private Integer version_Id;
    @Column(nullable = true) 
    private Integer auto_Firm_Flag;
    @Column(nullable = true) 
    private Integer auto_Firm_Months;
    @Column(nullable = true) 
    private Integer auto_Firm_Days;
    with getters and setters...
}

Другим объектом является

@Entity
@Table(name = "Cache_Media")
public class CacheMedia{

@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Integer id;
@Column(name="code")
private String code;
@Column(name="POSITION")
private Integer position;
@Column(name="DESCRIPTION")
private String media_Description;
@Column(name="LOAD_DATE")
private Date loadDate; with the getter and setter ..}

Я хочу написать интерфейс crudRepository. таких как

public interface ReleaseDateTypeRepository extends CrudRepository<ReleaseDateType, Long>{
  @Query("Select * from A a  left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();
}
4b9b3361

Ответ 1

Если вы хотите сделать связь one-to-one, вы должны изменить следующий код в модели ReleaseDateType:

@Column(nullable = true) 
private Integer media_Id;

для

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CACHE_MEDIA_ID", nullable=true)
private CacheMedia cacheMedia ;

а в модели CacheMedia вам нужно добавить:

@OneToOne(cascade=ALL, mappedBy="ReleaseDateType")
private ReleaseDateType releaseDateType;

то в вашем репозитории вы должны заменить:

@Query("Select * from A a  left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();

по:

//In this case a query annotation is not need since spring constructs the query from the method name
public List<ReleaseDateType> findByCacheMedia_Id(Integer id); 

или:

@Query("FROM ReleaseDateType AS rdt WHERE cm.rdt.cacheMedia.id = ?1")    //This is using a named query method
public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);

Или, если вы предпочитаете отношение @OneToMany и @ManyToOne, вы должны изменить следующий код в модели ReleaseDateType:

@Column(nullable = true) 
private Integer media_Id;

для

@OneToMany(cascade=ALL, mappedBy="ReleaseDateType")
private List<CacheMedia> cacheMedias ;

а в модели CacheMedia вам нужно добавить:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="RELEASE_DATE_TYPE_ID", nullable=true)
private ReleaseDateType releaseDateType;

то в вашем репозитории вы должны заменить:

@Query("Select * from A a  left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();

по:

//In this case a query annotation is not need since spring constructs the query from the method name
public List<ReleaseDateType> findByCacheMedias_Id(Integer id); 

или:

@Query("FROM ReleaseDateType AS rdt LEFT JOIN rdt.cacheMedias AS cm WHERE cm.id = ?1")    //This is using a named query method
public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);