英文:
How to make an inner join with @Query JPA?
问题
以下是翻译好的部分:
Familia
public class Familia {
@Id
@GeneratedValue
private Integer id;
private String nombre;
private String linkImagen;
private Date fechaRegistro = new Date();
@Column(length=1000)
private String descripcion;
@Column(insertable = false, updatable = false)
private String dtype;
}
Especie
public class Especie extends Familia {
@GeneratedValue
private Integer diasGerminacionDesde;
private Integer diasGerminacionHasta;
private Integer distEntrePlantas;
private Integer distEntreLineas;
@ManyToOne
private Familia familia;
@JoinTable(name = "especie_mesesSiembra",
joinColumns = @JoinColumn(name = "especie_id"),
inverseJoinColumns = @JoinColumn(name = "mesSiembra_id"))
@ManyToMany
@OrderBy
private Set<MesSiembra> mesesSiembra = new LinkedHashSet<>();
}
Variedad
public class Variedad extends Especie {
@GeneratedValue
@ManyToOne
private Especie especie;
}
Variedad controller
@GetMapping(params= {"nombreEspecie"})
public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
return servicio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
}
Variedad service
public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
return repositorio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
}
Variedad repository
public interface VariedadRepositorio extends JpaRepository<Variedad, Integer>{
@Query("select v from Variedad v "
+ "join Especie e "
+ "where v.dtype='Variedad' "
+ "and e.nombre=nombreEspecie "
+ "order by v.nombre asc")
Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
}
英文:
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
public class Familia {
@Id
@GeneratedValue
private Integer id;
private String nombre;
private String linkImagen;
private Date fechaRegistro = new Date();
@Column(length=1000)
private String descripcion;
@Column(insertable = false, updatable = false)
private String dtype;
}
Especie
public class Especie extends Familia {
@GeneratedValue
private Integer diasGerminacionDesde;
private Integer diasGerminacionHasta;
private Integer distEntrePlantas;
private Integer distEntreLineas;
@ManyToOne
private Familia familia;
@JoinTable(name = "especie_mesesSiembra",
joinColumns = @JoinColumn(name = "especie_id"),
inverseJoinColumns = @JoinColumn(name = "mesSiembra_id"))
@ManyToMany
@OrderBy
private Set<MesSiembra> mesesSiembra = new LinkedHashSet<>();
}
Variedad
public class Variedad extends Especie {
@GeneratedValue
@ManyToOne
private Especie especie;
}
Variedad controller
@GetMapping(params= {"nombreEspecie"})
public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
return servicio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
}
Variedad service
public Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina) {
return repositorio.listarTodosFiltradoPorNombreEspecie(nombreEspecie, pagina);
}
Variedad repository
public interface VariedadRepositorio extends JpaRepository<Variedad, Integer>{
@Query("select v from Variedad v "
+ "join Especie e"
+ "where v.dtype='Variedad' "
+ "and e.nombre=nombreEspecie"
+ "order by v.nombre asc")
Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
}
答案1
得分: 1
如果您正在使用JPA,您不需要指定连接的实体。您只需从原始实体中引用相关属性。
示例:
@Query("select v from Variedad v "
+ "inner join v.especie e"
+ "where v.dtype='Variedad' "
+ "and e.nombre=nombreEspecie"
+ "order by v.nombre asc")
Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
要执行不区分大小写的字符串比较,您可以使用'lower'和'like':
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:
@Query("select v from Variedad v "
+ "inner join v.especie e"
+ "where v.dtype='Variedad' "
+ "and e.nombre=nombreEspecie"
+ "order by v.nombre asc")
Page<Variedad> listarTodosFiltradoPorNombreEspecie(String nombreEspecie, Pageable pagina);
To perform a string comparison that is case insensitive you could use 'lower' and 'like'
where lower(v.dtype) like lower(concat('%', nombreEspecie,'%'))
I have not tested this so there might be a typo.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论