【问题标题】:JPA native query returns no recordsJPA 本机查询不返回任何记录
【发布时间】:2013-02-24 01:03:26
【问题描述】:

这是为相关后端获取指定级别内的模块实体的方​​法。

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 中执行确切的查询时,我得到一行作为结果。 但是此方法返回空列表。日志中没有错误 - 只是空列表。 我的原生查询有什么问题?

【问题讨论】:

  • 我唯一能想到的是,您设置的 2 个参数与您在 sql developer 中运行的查询中输入的参数不同。另一种可能性是由于数据类型的原因,hibernate 或 oracle 正在强制转换某些内容,这会导致查询不返回任何值。您可以发布您在 Java 中看到的参数以及您在 SQL 开发人员中执行的查询吗?还添加映射可能有助于找到问题。
  • 我正在设置正确的值 - 我确定。但是您的第二个陈述可能是正确的。当我从本机查询中删除 Module.class 参数时,我得到“JDBC 类型没有方言映射:-9”。快速搜索后我来到link我实现了它,没有抛出异常,但仍然没有返回结果。

标签: oracle hibernate jpa nativequery


【解决方案1】:

你离开了吗?误入了那里?

试试……

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 语法。我认为使用 ?是正确的。 link.
  • 啊!!!我记得这个!当您将in 运算符与位置或命名参数一起使用时,hibernate 的行为会略有不同。我记得在大约 4 年前的一个项目中,我们不得不对使用 in 的查询使用命名参数,因为它不能与位置参数一起正常工作。 @Dominik,使用您喜欢的搜索引擎并搜索 hibernate 命名参数 以了解如何使用它们。
  • 啊好吧,我从来没见过?之前参考...是的,在 Hibernate 中,您在查询字符串中使用 :paramName 和 query.setParameter("paramName", joineLevels);等
  • 我重写了查询以使用命名参数,但结果相同。我也尝试了带有命名参数的休眠 session.createSQLQuery(..),但结果再次相同。
【解决方案2】:

我确实找到了原始问题的答案,但我通过使用复合键为 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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多