Hibernate 3 null异常,加入fetch查询

时间:2012-01-17 16:54:39

标签: mysql hibernate nullpointerexception hql hibernate3

我的搜索查询存在问题。

我的模特:

项目:

@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();
    }
}

我想用一些搜索字符串搜索项目,我想在名称,简短描述,扩展描述和AND标签中找到带有此字符串的项目。 搜索标签是个问题。

这是我的问题:

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 like:search”给我一个错误(一切正常,没有它):

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

只有在找到某些项目时才会出现此错误(没有返回结果时没有错误)。 有任何想法吗?谢谢!

编辑:忘了告诉项目可能有0到n个标签......

2 个答案:

答案 0 :(得分:1)

鉴于代码和异常,这意味着您有一个没有名称的标记:getName().hashCode()抛出NullPointerException,因此getName()返回null。

也就是说,您的查询是危险的,因为它返回带有部分标签列表的项目。您应该将查询重写为

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))

答案 1 :(得分:0)

所以,我刚刚从JB Nizet建议的查询中删除了“fetch”关键字,并且它有效...

最终查询:

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有关,说这个问题不会得到纠正......

编辑:再次尝试使用fetch,它有效......不明白为什么!