我的搜索查询存在问题。
我的模特:
项目:
@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个标签......
答案 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,它有效......不明白为什么!