2012-01-17 15 views
0

我遇到搜索查詢問題。Hibernate 3 null異常,聯接獲取查詢

我的模型:

項目:

@Entity 
@Table(name = "project") 
public class Project { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private Integer id; 

    @ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(
     name="project_tag", 
     joinColumns = @JoinColumn(name="project_id"), 
     inverseJoinColumns = @JoinColumn(name="tag_id") 
    ) 
    private Set<Tag> requiredSkills; 

    @Column(name="name") 
    private String name; 

    @Column(name = "short_description", columnDefinition="TEXT") 
    private String shortdescription; 

    @Column(name = "extended_description", columnDefinition="TEXT") 
    private String extendedDescription; 
} 

標籤:

@Entity 
@Table(name="tag", uniqueConstraints = {@UniqueConstraint(columnNames={"name"})}) 
public class Tag { 

    @Id 
    @Column(name = "id") 
    @GeneratedValue 
    private Integer id; 

    @Column(name = "name") 
    private String name; 

    public int hashCode() { 
     return getName().hashCode(); 
    } 
} 

我想搜索的項目與一些搜索字符串,我想找到項目,該字符串中的名稱,簡短說明,擴展說明和標籤。 搜索標籤是問題。

這裏是我的查詢:

public List<Project> search(String search) { 
     search = "%" + search + "%"; 
     Query query = sessionFactory.getCurrentSession().createQuery(
       "from Project p" + 
       " left join fetch p.requiredSkills r" + 
       " where p.name like :search" + 
       " or p.shortdescription like :search" + 
       " or p.extendedDescription like :search" + 
       " or r.name like :search" 
       ); 
     query.setParameter("search", search); 

     query.setMaxResults(30); 

     return (List<Project>) query.list(); 
    } 

線 「或類似r.name:搜索」 是給我一個錯誤(一切正常,沒有它):

java.lang.NullPointerException 
    myProject.model.Tag.hashCode(Tag.java:53) 

我得到這個僅當找到一些項目時出錯(沒有返回結果時沒有錯誤)。 任何想法?謝謝!

編輯:忘了告訴大家,項目可以有0至N個標籤...

+0

你爲什麼不告訴我們真實的代碼?錯誤是一個'Tag.hashCode()',但你的Tag類沒有定義任何'hashCode()'。 –

+0

實現了hashcode()方法。如果我向你展示整個代碼,你會哭泣。但我可以添加hashCode()方法,這是真的。 – Nanocom

回答

0

所以,我只是刪除了JB Nizet提出的查詢 「取」 關鍵字,和它的工作...

最終查詢:

Query query = sessionFactory.getCurrentSession().createQuery(
      "select distinct p" + 
      " from Project p" + 
      " left join p.requiredSkills r" + 
      " where p.name like :search" + 
      " or p.shortdescription like :search" + 
      " or p.extendedDescription like :search" + 
      " or exists(select r2 from Project p2 join p2.requiredSkills r2 where p2.id = p.id and r2.name like :search)"); 

魔法門與https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#I_have_a_nonlazy_set_of_entities_that_override_equals_and_Hibernate_throws_a_NullPointerException有關,說這個問題不會被糾正...

編輯:再次嘗試與取,它的工作......不明白爲什麼!

1

由於代碼和異常,這意味着你有一個標籤,而不名稱:getName().hashCode()拋出一個NullPointerException,所以getName()返回空。

也就是說,您的查詢是一個危險的查詢,因爲它返回具有其部分標籤列表的項目。你應該重寫查詢作爲

select p from Project p 
left join fetch p.requiredSkills r 
where p.name like :search 
or p.shortdescription like :search 
or p.extendedDescription like :search 
or (exists(select r2.id from Project p2 
      inner join p2.requiredSkills r2 
      where p2.id = p.id and r2.name like :search)) 
+0

沒有標籤名稱在數據庫中爲NULL ... – Nanocom

+0

順便說一句,目前我只有1個項目和2個標籤在數據庫中相關,每個人都有一個非空名稱。 – Nanocom

+0

存在(從...選擇r2.id)而不是存在(選擇t.id)我猜。無論如何,這會導致一個錯誤「MySQLSyntaxErrorException:未知列在‘字段列表’tag5_.id'」, – Nanocom