JPA 原生查询没有返回记录。

4

这是一种获取相关后端指定层级内的模块实体的方法。

public List<Module> getModulesWithinLevel(Long backendId, ModuleLevel... levels) {
        String joinedLevels = serializeLevels(levels);
        Query query = entityManager.createNativeQuery("SELECT DISTINCT M.* FROM MODULES M JOIN ROUTING_SEQUENCES RS ON RS.BCK_ID = M.MOD_ID WHERE M.MOD_LEVEL IN (?) AND RS.BCK_ID = ?", Module.class);
        query.setParameter(1, joinedLevels);
        query.setParameter(2, backendId);
        List l = query.getResultList();
        return l;
    }

当我在SQL Developer中执行相同的查询时,会返回一行结果。但是使用这种方法返回一个空列表。日志中没有错误信息,只是返回了一个空列表。我的本地查询有什么问题吗?

我能想到的唯一可能是你设置的两个参数与你在SQL开发人员中运行的查询不同。另一个可能性是由于数据类型,Hibernate或Oracle正在进行某种转换,导致查询没有返回任何值。你能否发布你在Java中看到的参数和在SQL开发人员中执行的查询?同时添加映射可能有助于找到问题所在。 - Augusto
我正在设置正确的值 - 我很确定。但你的第二个陈述可能是正确的。当我从本地查询中删除Module.class参数时,我会得到“没有JDBC类型的方言映射:-9”。快速搜索后,我找到了链接。我实施了它,没有抛出异常,但仍然没有返回结果。 - DominikM
2个回答

0

你是不是误留了这个问号?

试试看...

Query query = entityManager.createNativeQuery("SELECT DISTINCT M.* FROM MODULES M JOIN ROUTING_SEQUENCES RS ON RS.BCK_ID = M.MOD_ID WHERE M.MOD_LEVEL IN (:1) AND RS.BCK_ID = :2", Module.class);

我不知道这个 :1 语法。我认为使用 ? 是正确的。链接 - DominikM
啊啊啊!!! 我记得这个!当您使用位置参数或命名参数与“in”操作符时,Hibernate的行为会略有不同。我记得在大约4年前的一个项目中,我们不得不使用命名参数来处理使用“in”的查询,因为它无法正常处理位置参数。@Dominik,请使用您喜欢的搜索引擎搜索 hibernate named parameters 以了解如何使用它们。 - Augusto
啊,好的,我以前从没见过这个问号引用...是的,在Hibernate中,你在查询字符串中使用:paramName,然后query.setParameter("paramName", joineLevels);等等。 - DaveB
我重新编写了查询以使用命名参数,但结果相同。我也尝试过使用命名参数的hibernate session.createSQLQuery(..),但结果仍然相同。 - DominikM

0

我找到了原问题的答案,但是通过实现具有组合键的 ROUTING_SEQUENCES 表中的实体来进行了一些绕过。 这个方法很有效:

Query query = entityManager.createQuery("SELECT m FROM Module m WHERE m.id IN (SELECT rs.id.moduleId FROM RoutingSequence rs WHERE rs.id.backendId = :backendId) AND m.level IN (:levels)", Module.class);
query.setParameter("backendId", backendId);
query.setParameter("levels", Arrays.asList(levels));
return query.getResultList();

实体:

@Entity
@Table(name = "ROUTING_SEQUENCES")
public class RoutingSequence extends AbstractEntity<RoutingSequencePK> implements Auditable {

    @EmbeddedId
    private RoutingSequencePK id;

    @Column(name = "RS_MANDATORY", nullable = false)
    private Boolean mandatory;

    @Column(name = "RS_ORDER")
    private int order;

    @Column(name = "RS_INSDTTM")
    private Date insertDate;

    @Column(name = "RS_UPDDTTM")
    private Date updateDate;
...
}

编号

@Embeddable
public class RoutingSequencePK implements Serializable {

    @Column(name = "BCK_ID")
    private Long backendId;

    @Column(name = "MOD_ID")
    private Long moduleId;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接