如何用IN语句编写spring数据查询?

时间:2017-10-06 15:43:06

标签: java oracle spring-boot spring-data

我需要通过entity2的ids

获取Entity1

有查询的参数 - 列表编号 - entity2的ID 。 和@OneToMany绑定的两个实体

@Entity
class Entity1 {
private Integer id;

private Entity2 entity2;

---------
@OneToMany(cascade = ALL, fetch =FetchType.EAGER)
@Column
public Entity2 getEntity2(){
return entity2;

}

@Entity
public class Entity2{

private Integer id;

@ManyToOne(FetchType.LAZY)
private Entity1 entity1;
}

我有工作代码

@Repository
public interface Entity1Repository extends JpaRepository<Entity1, Integer> {

@Query("SELECT c" +
            " FROM  Entity1 c" +
            " inner JOIN  c.entity2 a" +
            "  WHERE  a.id IN(?1)")
    Set<Entity1> findByEntity2Ids(List<Integer> pEntity2_Ids);
}

我希望使用Spring Data

进行美化查询

并写下类似

的内容
Set<Entity1> findAllByEntity2In(List<Integer> pChannels);

但它现在不起作用

我抓住了一个Enxception:

\引起:java.lang.IllegalArgumentException:参数值元素[2]与期望类型[com.test.Entity2(n / a)]

不匹配

谁知道如何解决?

谢谢!

3 个答案:

答案 0 :(得分:1)

<强> UPD

我找到了Spring Data的查询:

  @Repository
    public interface Entity1Repository extends JpaRepository<Entity1, Integer> {

    Set<Enity1> findByEntity2In(List<Integer> pEntities2Ids);

}

答案 1 :(得分:0)

从查询中删除括号。 它应该是这样的:

@Query("SELECT c" +
            " FROM  Entity1 c" +
            " inner JOIN  c.entity2 a" +
            "  WHERE  a.id IN ?1")

为了获得更好的可读性查询,您可以选择使用命名参数而不是位置参数。这么说,您的查询可能是这样的:

@Query("SELECT c" +
            " FROM  Entity1 c" +
            " inner JOIN  c.entity2 a" +
            "  WHERE  a.id IN :ids")
    Set<Entity1> findByEntity2Ids(@Param("ids") List<Integer> pEntity2_Ids);

答案 2 :(得分:0)

您可以按列表或实体2的集合进行搜索,如

Set<Entity1> findByEntity2In(Set<Entity2> entity2);

要按Entity2 Id查找,您需要编写像

这样的查询
@Query("SELECT ent1 FROM  Entity1 ent1 INNER JOIN  c.entity2 ent2 WHERE  ent2.id IN :ids")
Set<Entity1> findByEntity2Ids(@Param("ids") List<Integer> pEntity2_Ids);