如何使用" IN"使用JPQL正确命令?

时间:2017-11-22 00:08:05

标签: java jpa

我在使用突击队时遇到了一些问题" IN"在我的jpql上,这里是这样的: 我有这些课程:

public class Empresa{

    @Id
    @Column(nullable = false, unique = true)
    @GeneratedValue
    private Long id;

    @JoinColumn(name = "id_tipo_empresa")
    @OneToOne(cascade = CascadeType.DETACH)
    private TipoEmpresa tipoEmpresa;
}

public class TipoEmpresa{
    @Id
    @Column(unique = true, nullable = false)
    @GeneratedValue
    private Long id;

    private Long valor;
}

然后我有这个服务,发送一个" TipoEmpresa"到我的EmpresaRepository的查询:

SERVICE

public List<Empresa> getEmpresasByTipoEmpresaAndTipoStatus(List<TipoEmpresa>tiposEmpresa) {
    List<Empresa> listaDeEmpresas=empresaRepository.getEmpresasByTipoEmpresa(tiposEmpresa);
    return listaDeEmpresas;
}

REPOSITORY

@Query(name = "SELECT E FROM Empresa E WHERE E.tipoEmpresa IN(:tipoEmpresa)")
List<Empresa> getEmpresasByTipoEmpresaAndTipoStatus(@Param("tipoEmpresa") List<TipoEmpresa> tipoEmpresa);

正如你所看到的那样,我试图获得所有的&#34; Empresa&#34;有一个&#34; tipoEmpresa&#34;在我的列表中列出,但在整理服务时,我收到此错误:

java.sql.SQLException: Operand should contain 1 column(s)

我不知道该怎么做,尝试了我能想到的一切,我做错了什么?

嗨老兄!首先,感谢您的帮助!

。 。

我尝试了g.Irani的建议,改变了我的代码,就是这样:

存储库

@Query(name = "SELECT E FROM Empresa E WHERE E.tipoEmpresa.id  IN :tipoEmpresa ")
List<Empresa> getEmpresasByTipoEmpresaAndTipoStatus(@Param("tipoEmpresa") List<Long> tipoEmpresa);

服务

//just a test...
List<Long> test =Arrays.asList(100l, 200l);
List<Empresa> listaDeEmpresas=empresaRepository.getEmpresasByTipoEmpresa(test);

但是现在我收到了这条错误消息:

java.lang.IllegalArgumentException: Parameter value element [100] did not match expected type [br.com.entities.TipoEmpresa (n/a)]

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

在WHERE子句中的IN之后,您应该显示一个包含1列的列表。
tipoEmpresa在下面查询你的代码是一个类(有2列)
@Query(name =“SELECT E FROM Empresa E WHERE E.tipoEmpresa IN(:tipoEmpresa)”)
你可以使用
@Query(name =“SELECT E FROM Empresa E WHERE E.tipoEmpresa.id IN(:tipoEmpresaIDs)”)
然后准备一份tipoEmpresa ID列表并设置为:tipoEmpresaIDs

请注意,在JPA中使用IN时,IN之后不需要()。 (只需使用... IN:tipoEmpresaIDs