2013-03-08 43 views
0

这是为相关后端获取指定级别的Module entites的方法。JPA本机查询不返回任何记录

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

+0

我能想到的唯一的事情就是2个参数你设置有不一样的人你把你在SQL开发中运行的查询。另一种可能性是由于数据类型的原因,hibernate或oracle正在转换某些内容,导致查询不返回任何值。你能发布你在Java中看到的参数以及你在SQL开发者中执行的查询吗?还添加映射可能有助于找到问题。 – Augusto 2013-03-08 13:14:53

+0

我设定正确的价值观 - 我相信。但是你的第二个陈述可能是真的。当我从本地查询中删除Module.class参数时,我得到“没有Dialect映射的JDBC类型:-9”。后续快速搜索我来到[链接](http://stackoverflow.com/questions/8991866/org-hibernate-mappingexception-no-dialect-mapping-for-jdbc-type-9) 我实现它,没有例外是抛出,但仍然没有结果返回。 – DominikM 2013-03-08 13:36:55

回答

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; 
0

你离开了吗?在那里错误?

的Try ...

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); 
+0

我不知道这个:1语法。我认为使用?是正确的。 [链接](http://en.wikibooks.org/wiki/Java_Persistence/Querying#Native_SQL_Queries)。 – DominikM 2013-03-08 13:34:59

+0

啊!我记得这个!当你使用具有位置或命名参数的'in'运算符时,hibernate的行为会略有不同。我记得在大约4年前的一个项目中,我们不得不为使用'in'的查询使用命名参数,因为它在位置参数上无法正常工作。 @Dominik,使用您的首选搜索引擎并搜索** hibernate命名参数**以查看如何使用它们。 – Augusto 2013-03-08 13:53:18

+0

好的,我从来没有见过?引用之前...是在你使用的Hibernate中:在查询字符串中的paramName和query.setParameter(“paramName”,joineLevels);等 – DaveB 2013-03-08 13:56:49