Hibernate生成损坏的查询



我有一个实体被Hibernate映射到数据库表:

@Entity
@NoArgsConstructor
@Getter 
@Setter
@FieldNameConstants
public class Set extends AbstractEntity {

@ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinColumn(name = "owner_id")
private User owner;

private LocalDate date;

private String password;

@Enumerated(EnumType.STRING)
private SetStatus status;

@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@Fetch(value = FetchMode.SUBSELECT)
@JoinTable(name = "set_user", joinColumns = @JoinColumn(name = "set_id"), inverseJoinColumns = @JoinColumn(name = "user_id"))
private List<User> users;

@ManyToMany(fetch = FetchType.EAGER, cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@Fetch(value = FetchMode.SUBSELECT)
@JoinTable(name = "cocktail_set", joinColumns = @JoinColumn(name = "set_id"), inverseJoinColumns = @JoinColumn(name = "cocktail_id"))
private List<Cocktail> cocktails;
}

映射是在这个Spring服务中完成的:

@Service
public class SetService {

@Autowired
private SetRepository setRepository;

public Page<Set> findAll(HttpSession session, SetSearch search, Pageable pageable) {

Specification<Set> specification = SetSpecifications.empty();

UUID id = (UUID)session.getAttribute("userId");
UserRole role = (UserRole)session.getAttribute("userRole");
if (role == UserRole.BARMEN)
specification = specification.and(SetSpecifications.setsForBarmen(id));
else if (role == UserRole.USER)
specification = specification.and(SetSpecifications.setsForUser(id));
if (search.getDate() != null)
specification = specification.and(SetSpecifications.dateEquals(search));
if (search.getStatus() != null)
specification = specification.and(SetSpecifications.statusEquals(search));

Sort sortByDate = Sort.by(Sort.Direction.DESC, "date");
return setRepository.findAll(specification, ((PageRequest)pageable).withSort(sortByDate));
}
}

但是,当我向该服务发送请求时,Hibernate会生成一个查询,该查询会导致带有hella长堆栈跟踪的SQLSyntaxErrorException。

查询是:

select
set0_.id as id1_5_,
set0_.date as date2_5_,
set0_.owner_id as owner_id5_5_,
set0_.password as password3_5_,
set0_.status as status4_5_ 
from

set
set0_ 
where
1=1 
order by
set0_.date desc limit ?

异常消息以开头

您的SQL语法有错误;查看与MySQL服务器版本对应的手册,了解在第1行"set set0_ where 1=1 order by set0_date desc limit 10"附近使用的正确语法

除了from后面的这条愚蠢的换行符外,查询看起来非常好,从异常消息来看,这似乎是原因。在我看来,Hibernate这次真的很失败。

我想得到一个答案,这是严格意义上的,即提供一个有效的解决方案。如果你没有,走过这里,不要浪费你的时间写作,也不要浪费我的时间阅读。

表名称集导致了此问题。set是MySQL的保留关键字。看看MySQL文档

最新更新