我有一个实体被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文档