2012-01-17 14 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