2011-10-13 56 views
1

我試圖從一個相當平凡的查詢中得到結果,並在jsp頁面上寫出這些結果。運行Glassfish 3.1,使用Netbeans。當我運行這個項目時,我得到了一個從例程返回的空列表。爲什麼我無法從這個相當平凡的查詢中得到任何結果?

當我右鍵單擊服務中的表並點擊查看數據時,我可以看到該表已填充,並且當我將查詢複製並超出查詢到SQL命令窗口並運行它時,它會給出預期的長度爲2的列表

有幾個類似的問題(如this one),其中沒有一個似乎有很大的幫助。我是新手,所以我可能沒有理解其他問題的解決方案。

這裏有很多因素,我不確定要包括什麼。我包含了執行查詢的例程,調用該例程的JSP代碼,我正在使用的實體類以及運行項目時獲得的服務器日誌的輸出。如果需要更多的信息,請告訴我,我會提出。

我真的很感激任何幫助。

格里夫

常規做查詢:

public static LinkedList<String> getCategories(EntityManager entityManager) { 
    try { 
     Query query = entityManager.createQuery(
       "SELECT DISTINCT i.category from ItemEntity i"); 
     List resultList = query.getResultList(); 
     if (!resultList.isEmpty()) { 
      return new LinkedList<String>(resultList); 
     } 
    } catch(Exception e) { 
     System.out.println(e); 
    } finally { 
     return new LinkedList<String>(); 
    } 
} 

JSP代碼調用子程序:

<body> 
    <h1>Store</h1> 
    <h2>Categories</h2> 
    <% 
     Context environmentContext 
       = (Context) new InitialContext().lookup("java:comp/env"); 
     EntityManager entityManager 
       = (EntityManager) environmentContext.lookup("persistence/dbunit"); 

     LinkedList<String> categories = DataBase.getCategories(entityManager); 

     ListIterator<String> categoryIterator = categories.listIterator(); 
     String category = ""; 
    %> 

    <form action="category.jsp"> 
     <% while (categoryIterator.hasNext()) { %> 
       <% category = categoryIterator.next(); %> 
       <input type="submit" class="submitButtonAsLink" value="<%= category %>" name="<%= category %>" /><br /> 
     <% } %> 
    </form> 
</body> 

ItemEntity.java:

@Entity 
public class ItemEntity implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id @GeneratedValue(strategy = GenerationType.AUTO) 
    private String id; 

    private String title; 
    private String longDescription; 
    private double cost; 
    private String category; 

    public String getId() { 
     return id; 
    } 

    public void setId(String id) { 
     this.id = id; 
    } 

    @Override 
    public int hashCode() { 
     int hash = 0; 
     hash += (id != null ? id.hashCode() : 0); 
     return hash; 
    } 

    @Override 
    public boolean equals(Object object) { 
     // TODO: Warning - this method won't work in the case the id fields are not set 
     if (!(object instanceof ItemEntity)) { 
      return false; 
     } 
     ItemEntity other = (ItemEntity) object; 
     if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) { 
      return false; 
     } 
     return true; 
    } 

    @Override 
    public String toString() { 
     return "store.model.entities.ItemTable[ id=" + id + " ]"; 
    } 

    //getters and setters omitted. 
    //There are getters and setters for every field except id. 
} 

服務器日誌:

INFO: file:/Users/griffgeorge/Dropbox/school/design-arch/labs/Lab4Exercise/build/web/WEB-INF/classes/_Lab4ExercisePU logout successful 
INFO: Instantiated an instance of org.hibernate.validator.engine.resolver.JPATraversableResolver. 
INFO: EclipseLink, version: Eclipse Persistence Services - 2.3.0.v20110604-r9504 
INFO: file:/Users/griffgeorge/Dropbox/school/design-arch/labs/Lab4Exercise/build/web/WEB-INF/classes/_Lab4ExercisePU login successful 
WARNING: Multiple [2] JMX MBeanServer instances exist, we will use the server at index [0] : [[email protected]]. 
WARNING: JMX MBeanServer in use: [[email protected]] from index [0] 
WARNING: JMX MBeanServer in use: [[email protected]] from index [1] 
WARNING: PER01000: Got SQLException executing statement "CREATE TABLE ITEMENTITY (ID VARCHAR(255) NOT NULL, CATEGORY VARCHAR(255), COST FLOAT, LONGDESCRIPTION VARCHAR(255), TITLE VARCHAR(255), PRIMARY KEY (ID))": java.sql.SQLException: Table/View 'ITEMENTITY' already exists in Schema 'APP'. 
WARNING: PER01000: Got SQLException executing statement "CREATE TABLE SEQUENCE (SEQ_NAME VARCHAR(50) NOT NULL, SEQ_COUNT DECIMAL(15), PRIMARY KEY (SEQ_NAME))": java.sql.SQLException: Table/View 'SEQUENCE' already exists in Schema 'APP'. 
WARNING: PER01000: Got SQLException executing statement "INSERT INTO SEQUENCE(SEQ_NAME, SEQ_COUNT) values ('SEQ_GEN', 0)": java.sql.SQLIntegrityConstraintViolationException: The statement was aborted because it would have caused a duplicate key value in a unique or primary key constraint or unique index identified by 'SQL111012114449870' defined on 'SEQUENCE'. 
INFO: WEB0671: Loading application [Lab4Exercise] at [/Lab4Exercise] 
+0

嘗試啓用日誌記錄SQL,參見,例如,在這裏,如何:http://stackoverflow.com/questions/3096814/jpa-eclipselink-returning-no-results/3097807#3097807;然後發佈結果,如果你還不知道。 – MaDa

回答

3

getCategories()方法總是返回一個空列表,因爲在finally返回始終運行(甚至第一return後)。

根本就不需要finally子句。您可以簡化這個

public static LinkedList<String> getCategories(EntityManager entityManager) { 
    try { 
     Query query = entityManager.createQuery(
       "SELECT DISTINCT i.category from ItemEntity i"); 
     return new LinkedList<String>(query.getResultList()); 
    } catch(Exception e) { 
     System.out.println(e); 
     return new LinkedList<String>(); 
    } 
} 

如果query.getResultList()不爲空,則返回字符串的非空鏈表。

如果您的query.getResultList()爲空,則返回空鏈接的字符串列表。

如果發生異常,則返回空列表。 正如您以前一樣,即使您的查詢正在返回數據,它也總是返回一個空列表。

爲了證明在finally的回報是一個獲得通過,看看這個

public class TestFinally { 
    public static void main(String[] args) { 
     System.out.println(TestFinally.test()); 
    } 

    public static int test() { 
     try { 
      return 1; 
     } finally { 
      return 0; 
     } 
    } 
} 

回報

0 
+0

是的,最終成爲它。只是我之前從未嘗試過的事情之一,並且不瞭解這種語言。你每天學習新的東西。 :) –

-1

談談你的persistence.xml?是指向你期望的數據源?然後是那個指向你所期望的連接池的數據源?

相關問題