如何在 @Query JPA 中进行内连接(inner join)?

huangapple go评论117阅读模式
英文:

How to make an inner join with @Query JPA?

问题

以下是翻译好的部分:

Familia

  1. public class Familia {
  2. @Id
  3. @GeneratedValue
  4. private Integer id;
  5. private String nombre;
  6. private String linkImagen;
  7. private Date fechaRegistro = new Date();
  8. @Column(length=1000)
  9. private String descripcion;
  10. @Column(insertable = false, updatable = false)
  11. private String dtype;
  12. }

Especie

  1. public class Especie extends Familia {
  2. @GeneratedValue
  3. private Integer diasGerminacionDesde;
  4. private Integer diasGerminacionHasta;
  5. private Integer distEntrePlantas;
  6. private Integer distEntreLineas;
  7. @ManyToOne
  8. private Familia familia;
  9. @JoinTable(name = "especie_mesesSiembra",
  10. joinColumns = @JoinColumn(name = "especie_id"),
  11. inverseJoinColumns = @JoinColumn(name = "mesSiembra_id"))
  12. @ManyToMany
  13. @OrderBy
  14. private Set<MesSiembra> mesesSiembra = new LinkedHashSet<>();
  15. }

Variedad

  1. public class Variedad extends Especie {
  2. @GeneratedValue
  3. @ManyToOne
  4. private Especie especie;
  5. }

Variedad controller

  1. @GetMapping(params= {"nombreEspecie"})
  2. public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
  3. return servicio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
  4. }

Variedad service

  1. public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
  2. return repositorio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
  3. }

Variedad repository

  1. public interface VariedadRepositorio extends JpaRepository<Variedad, Integer>{
  2. @Query("select v from Variedad v "
  3. + "join Especie e "
  4. + "where v.dtype='Variedad' "
  5. + "and e.nombre=nombreEspecie "
  6. + "order by v.nombre asc")
  7. Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
  8. }
英文:

I would like to make a query with @Query JPA and I don't know how to do it. I would like to return all the Varieties (Variedad) that correspond to the name (nombre) of a Species (Especie). Also, I would like to add a ContainingIgnoreCase to the @Query

Familia

  1. public class Familia {
  2. @Id
  3. @GeneratedValue
  4. private Integer id;
  5. private String nombre;
  6. private String linkImagen;
  7. private Date fechaRegistro = new Date();
  8. @Column(length=1000)
  9. private String descripcion;
  10. @Column(insertable = false, updatable = false)
  11. private String dtype;
  12. }

Especie

  1. public class Especie extends Familia {
  2. @GeneratedValue
  3. private Integer diasGerminacionDesde;
  4. private Integer diasGerminacionHasta;
  5. private Integer distEntrePlantas;
  6. private Integer distEntreLineas;
  7. @ManyToOne
  8. private Familia familia;
  9. @JoinTable(name = &quot;especie_mesesSiembra&quot;,
  10. joinColumns = @JoinColumn(name = &quot;especie_id&quot;),
  11. inverseJoinColumns = @JoinColumn(name = &quot;mesSiembra_id&quot;))
  12. @ManyToMany
  13. @OrderBy
  14. private Set&lt;MesSiembra&gt; mesesSiembra = new LinkedHashSet&lt;&gt;();
  15. }

Variedad

  1. public class Variedad extends Especie {
  2. @GeneratedValue
  3. @ManyToOne
  4. private Especie especie;
  5. }

Variedad controller

  1. @GetMapping(params= {&quot;nombreEspecie&quot;})
  2. public Page&lt;Variedad&gt; listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
  3. return servicio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
  4. }

Variedad service

  1. public Page&lt;Variedad&gt; listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
  2. return repositorio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
  3. }

Variedad repository

  1. public interface VariedadRepositorio extends JpaRepository&lt;Variedad, Integer&gt;{
  2. @Query(&quot;select v from Variedad v &quot;
  3. + &quot;join Especie e&quot;
  4. + &quot;where v.dtype=&#39;Variedad&#39; &quot;
  5. + &quot;and e.nombre=nombreEspecie&quot;
  6. + &quot;order by v.nombre asc&quot;)
  7. Page&lt;Variedad&gt; listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
  8. }

答案1

得分: 1

如果您正在使用JPA,您不需要指定连接的实体。您只需从原始实体中引用相关属性。

示例:

  1. @Query("select v from Variedad v "
  2. + "inner join v.especie e"
  3. + "where v.dtype='Variedad' "
  4. + "and e.nombre=nombreEspecie"
  5. + "order by v.nombre asc")
  6. Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);

要执行不区分大小写的字符串比较,您可以使用'lower'和'like':

  1. where lower(v.dtype) like lower(concat('%', nombreEspecie,'%'))

我没有测试过这个,所以可能会有拼写错误。

英文:

If you are doing a JPA you don't specify the joining entity. You simply reference the related property from the original entity.

Example:

  1. @Query(&quot;select v from Variedad v &quot;
  2. + &quot;inner join v.especie e&quot;
  3. + &quot;where v.dtype=&#39;Variedad&#39; &quot;
  4. + &quot;and e.nombre=nombreEspecie&quot;
  5. + &quot;order by v.nombre asc&quot;)
  6. Page&lt;Variedad&gt; listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);

To perform a string comparison that is case insensitive you could use 'lower' and 'like'

  1. where lower(v.dtype) like lower(concat(&#39;%&#39;, nombreEspecie,&#39;%&#39;))

I have not tested this so there might be a typo.

huangapple
  • 本文由 发表于 2020年8月26日 22:26:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/63599795.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定