2017-08-14 40 views
0

我最近適應更大的項目。我做的第一件事是更新3年前的依賴關係(Hibernate從4.1.4到5.2.10,java 7到8,tomee 1.7.4到7.0.3)。
但是,由於我並不完全熟悉Hibernate升級是一個挑戰,因爲我遇到了很多問題。雖然到目前爲止我能夠解決其中的大部分問題,但我無法將自己的頭圍繞在當前的問題上。有一個現有的通用函數來從表中獲取所有實體。
查詢是基於條件創建的,但原始SQL查詢似乎是錯誤的,因此沒有數據返回;更確切地說:表格和列名不會被替換。調試打印,你可以找到下面的結果代碼如下所示:基於標準的API通用的findAll查詢生成錯誤的SQL

select generatedAlias0 from TestReferenceEntity as generatedAlias0 



實體:

@Entity 
@Table(name = "TEST_TYPE_REF") 
@NamedQueries({@NamedQuery(name = "findTestEntityByName", query = "SELECT bt FROM TestReferenceEntity bt WHERE bt.name = :name") }) 
public class TestReferenceEntity extends AbstractEntity { 
    public static final String FIND_BY_NAME = "findTestEntityByName"; 
    public static final String TYPENAME_PARAM_NAME = "name"; 

    @NotNull 
    @Size(max = 50) 
    @Column(name = "NAME") 
    private String name; 

    @Size(max = 50) 
    @Column(name = "PREFIX") 
    private String prefix; 

    @Size(max = 100) 
    @Column(name = "IDENT_REGEXP") 
    private String regexp; 
} 

AbstractDao的:

public abstract class AbstractDao<E extends AbstractEntity> implements AbstractService<E> { 
    public static final String PERSISTENCE_UNIT = "MeineJpaPU"; 

    private static Logger LOG = Logger.getLogger(AbstractDao.class); 

    @PersistenceContext(unitName = PERSISTENCE_UNIT) 
    private EntityManager em; 

    @Inject 
    private UserService userService; 

    private E entityClass; //This is set elsewhere 

    public List<E> findAll() { 
     return findAll(1, 1000); 
    } 

    public List<E> findAll(final int page, final int rowsPerPage) { 
     final Class<E> clazz = getEntityClass(); //TestReferenceEntity.class 
     final CriteriaBuilder cb = em.getCriteriaBuilder(); 
     final CriteriaQuery<E> criteria = cb.createQuery(clazz); 
     final Root<E> r = criteria.from(clazz); 
     criteria.select(r); 

     final TypedQuery<E> query = getEntityManager().createQuery(criteria); 
     query.setFirstResult(page - 1); 
     query.setMaxResults((page - 1) * rowsPerPage); 
     System.out.println(">>>>>>>>>>>> " + query.unwrap(org.hibernate.Query.class).getQueryString()); 

     return query.getResultList(); //Empty - but there is data in the table 
    } 
} 

的persistence.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="1.0" 
    xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"> 
    <persistence-unit name="MeineJpaPU" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>java:openejb/Resource/jdbc/PROJECTNAME</jta-data-source> 
     <exclude-unlisted-classes>false</exclude-unlisted-classes> 
     <properties> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/> 
      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.hbm2ddl.auto" value="create" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

我最好的猜測是,我失蹤(註釋嗎?)在Hibernate的後續版本增加了一些關鍵部分。畢竟我們使用的版本有點舊了。 我已經研究過這種行爲,但找不到與我的問題相符的任何內容。 Hibernate的遷移指南也沒有幫助。


我希望你能引導我走向一個解決方案。在此先感謝,
丹尼爾

+0

保健佳品實際的SQL生成的,你說是不正確的?因爲你看起來像張貼JPQL。 –

+0

它看起來沒有執行SQL語句。我在我的MySQL實例上啓用了查詢日誌記錄來驗證這一點。有趣的是,也沒有拋出異常。 我將如何去調試甚至更多?是不是我打印的那個會被執行的查詢?正如我剛纔提到的,我最近只適應了這個項目,並且不熟悉hibernate來正確調試/修復它。 – Ch4t4r

+0

當你調用'getResultList()'(或者至少是用於我使用的JPA提供者,而不是你選擇的那個)時,SQL總是被執行(或者至少應該是)。如果不是,那麼你在JPA提供程序中報告錯誤 –

回答

1

findAll()(無參數)傳遞頁1。

query.setMaxResults((page - 1) * rowsPerPage); 

結果query.setMaxResults(0)

似乎一直在Hibernate實現變化,你說,它一直在以前工作的罰款。