2013-03-08 99 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