Je veux écrire une requête comme SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.id
. Je suis nouveau à Spring Data JPA. Je ne sais pas comment écrire des entités pour la requête de jointure. Voici une tentative:
@Entity
@Table(name = "Release_date_type")
public class ReleaseDateType {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Integer release_date_type_id;
// ...
@Column(nullable = true)
private Integer media_Id;
// with getters and setters...
}
Une autre entité est:
@Entity
@Table(name = "Cache_Media")
public class CacheMedia {
@Id
@GeneratedValue(strategy=GenerationType.TABLE)
private Integer id;
// ...
private Date loadDate; //with the getter and setter ..
}
Je veux écrire une interface crudRepository
telle que
public interface ReleaseDateTypeRepository extends CrudRepository<ReleaseDateType, Long>{
@Query("SELECT * FROM Release_date_type a LEFT JOIN cache_media b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();
}
Pour un exemple typique d'employés possédant un ou plusieurs téléphones, voir cette section de wikibook .
Pour votre exemple spécifique, si vous voulez faire un one-to-one
_ relation, vous devez modifier le code suivant dans le modèle ReleaseDateType:
@Column(nullable = true)
private Integer media_Id;
pour:
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name="CACHE_MEDIA_ID", nullable=true)
private CacheMedia cacheMedia ;
et dans le modèle CacheMedia, vous devez ajouter:
@OneToOne(cascade=ALL, mappedBy="ReleaseDateType")
private ReleaseDateType releaseDateType;
puis dans votre référentiel, vous devez remplacer:
@Query("Select * from A a left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();
par:
//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);
ou par:
@Query("FROM ReleaseDateType AS rdt WHERE cm.rdt.cacheMedia.id = ?1") //This is using a named query method
public List<ReleaseDateType> FindAllWithDescriptionQuery(Integer id);
Ou si vous préférez faire un @OneToMany
et @ManyToOne
_ relation, vous devez modifier le code suivant dans le modèle ReleaseDateType:
@Column(nullable = true)
private Integer media_Id;
pour:
@OneToMany(cascade=ALL, mappedBy="ReleaseDateType")
private List<CacheMedia> cacheMedias ;
et dans le modèle CacheMedia, vous devez ajouter:
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="RELEASE_DATE_TYPE_ID", nullable=true)
private ReleaseDateType releaseDateType;
puis dans votre référentiel, vous devez remplacer:
@Query("Select * from A a left join B b on a.id=b.id")
public List<ReleaseDateType> FindAllWithDescriptionQuery();
par:
//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);
ou par:
@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);