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注入攻击。