Hibernate 3 null исключение, присоединиться к запросу выборки - PullRequest
0 голосов
/ 17 января 2012

У меня проблема с поисковым запросом.

Моя модель:

Проект:

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

IЯ хочу найти проекты с некоторой строкой поиска, и я хочу найти проекты с этой строкой в ​​имени, кратком описании, расширенном описании и тегах 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 тегов ...

Ответы [ 2 ]

1 голос
/ 17 января 2012

Учитывая код и исключение, это означает, что у вас есть тег без имени: 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 голосов
/ 17 января 2012

Итак, я просто удалил ключевое слово "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, все заработало ... Не понимаю почему!

...