Java Spring数据jpa中的JPQL查询
假设我们有:Java Spring数据jpa中的JPQL查询,java,spring,jpa,spring-data-jpa,Java,Spring,Jpa,Spring Data Jpa,假设我们有: class Range { public long start; public long end; } 该JPA实体: @Entity @Table(name="entry") public class Entry { @Id long id; @OneToMany Set<Individual> individuals; } @Entity @Table(name="individual") public class Individual
class Range {
public long start;
public long end;
}
该JPA实体:
@Entity
@Table(name="entry")
public class Entry {
@Id
long id;
@OneToMany
Set<Individual> individuals;
}
@Entity
@Table(name="individual")
public class Individual {
@Id
long id;
long code;
@ManyToOne
Entry entry;
}
以及控制器:
public class IndexedEntryController {
EntityManagerFactory emf;
List<Entry> find(List<Range> lst) {
String str = "";
for(Range r:lst) {
if(!str.isEmpty) {
str += " or ";
}
str += "(i.code between " + r.start + " and " + r.end + ")";
}
String query = "Select i.entry from Individual i where " + str + " group by i.entry having count(i) > " + lst.size()-1;
EntityManager em = emf.createEntityManager();
return em.createQuery(query).getResultList();
}
}
公共类IndexedEntryController{
实体管理工厂emf;
列表查找(列表lst){
字符串str=“”;
用于(范围r:lst){
如果(!str.isEmpty){
str+=“或”;
}
str+=“(i.代码介于“+r.start+”和“+r.end+”);
}
String query=“从单个i中选择i.entry,其中“+str+”按具有计数(i)>”的i.entry分组”+lst.size()-1;
EntityManager em=emf.createEntityManager();
返回em.createQuery(query.getResultList();
}
}
此查询返回所有具有n-1
个体且代码介于某个特定范围之间的条目,其中n
是范围数
我想转到Spring
JpaRepository
。如何使用JpaRepository
实现此查询?您的代码看起来不正确。如果lst
包含多个范围,它将生成无效的SQL,例如或(i.code介于1和9之间)(i.code介于11和19之间)(i.code介于21和29之间)
。查看您的代码是否正在运行。即使使用单个范围(where或(…)
),整个查询也将无效。除此之外,您可以将其转换为本机SQL查询,并通过任何JPA存储库将其作为本机查询运行。如果(!str.isEmpty())如我前面所述,使用类似于@Query(nativeQuery=true,value=“?1”)的方法为条目创建一个常规的JpaRepository
(字符串查询)
并将预构建的查询传递给此方法。请记住,当您通过直接连接值来构建查询时,您所做的工作很容易受到SQL注入攻击。