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

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

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 = &quot;especie_mesesSiembra&quot;, 
			joinColumns = @JoinColumn(name = &quot;especie_id&quot;), 
			inverseJoinColumns = @JoinColumn(name = &quot;mesSiembra_id&quot;))

	@ManyToMany
	@OrderBy
	private Set&lt;MesSiembra&gt; mesesSiembra = new LinkedHashSet&lt;&gt;();

}

Variedad

public class Variedad extends Especie {
	
	@GeneratedValue

	@ManyToOne
	private Especie especie;
}

Variedad controller

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

Variedad service

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

Variedad repository

public interface VariedadRepositorio extends JpaRepository&lt;Variedad, Integer&gt;{

	@Query(&quot;select v from Variedad v &quot;
			+ &quot;join Especie e&quot;
			+ &quot;where v.dtype=&#39;Variedad&#39; &quot;
			+ &quot;and e.nombre=nombreEspecie&quot;
			+ &quot;order by v.nombre asc&quot;)
	Page&lt;Variedad&gt; 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(&quot;select v from Variedad v &quot;
        + &quot;inner join v.especie e&quot;
        + &quot;where v.dtype=&#39;Variedad&#39; &quot;
        + &quot;and e.nombre=nombreEspecie&quot;
        + &quot;order by v.nombre asc&quot;)
Page&lt;Variedad&gt; 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(&#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:

确定