【问题标题】:Hibernate 3 null exception, join fetch queryHibernate 3 null 异常,join fetch 查询
【发布时间】:2012-02-12 11:42:27
【问题描述】:

我的搜索查询有问题。

我的模特:

项目:

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

“or r.name like :search”这行给了我一个错误(没有它一切正常):

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

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

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

【问题讨论】:

  • 你为什么不向我们展示真实的代码?错误是 Tag.hashCode(),但您的 Tag 类没有定义任何 hashCode()
  • hashcode() 方法已实现。如果我给你看整个代码,你会哭的。但是我可以添加 hashCode() 方法,这是真的。

标签: mysql hibernate nullpointerexception hql hibernate3


【解决方案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个项目和2个与之相关的标签,每个标签都有一个非空名称。
  • exists(select r2.id from...) 而不是 exists(select t.id) 我猜。无论如何,这会导致错误“MySQLSyntaxErrorException: Unknown column 'tag5_.id' in 'field list'”,
  • 查询以:或存在(select tag5_.id from project project3_ where project3_.id=project0_.id and (tag5_.name like ?))结尾,好像inner join不工作跨度>
  • 对不起。我修复了查询(嗯,我希望如此......)。
  • 所以,更正查询的错误是:java.lang.NullPointerException at.ac.tuwien.qse.ase.ideafactory.model.Tag.hashCode(Tag.java:52) java.lang.NullPointerException at.ac.tuwien.qse.ase.ideafactory.model.Tag.hashCode(Tag.java:52) util.HashMap.put(HashMap.java:389) java.util.HashSet.add(HashSet.java:217) java.util.AbstractCollection.addAll(AbstractCollection.java:322) org.hibernate.collection.PersistentSet.endRead( PersistentSet.java:352) - 和之前一样
【解决方案2】:

所以,我刚刚从 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,它成功了...不明白为什么!

【讨论】:

    猜你喜欢
    • 2015-04-17
    • 2015-01-30
    • 1970-01-01
    • 2021-11-26
    • 2017-09-21
    • 1970-01-01
    • 2013-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多