如何解决SQLGrammarException:无法准备语句
我有一个带有h2数据库的Spring Boot应用程序,该数据库由CrudRepository寻址。
public interface PetRepository extends CrudRepository<PetBE,Long> {
@Query("SELECT p FROM PetBE p INNER JOIN TagBE t WHERE t.name IN :tags")
public List<PetBE> findPetsByAnyTag(@Param("tags") List<String> tags);
}
我的实体如下
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "pets")
public class PetBE {
@Id
private long id;
@NonNull
private String name;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "category_id",referencedColumnName = "id")
private CategoryBE category;
@NonNull
@ElementCollection
private List<String> photoUrls;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "pet_tags",joinColumns = @JoinColumn(name = "pet_id"),inverseJoinColumns = @JoinColumn(name = "tag_id"))
@OrderColumn(name = "id")
private List<TagBE> tags;
@Enumerated(EnumType.STRING)
private StatusEnum status;
}
@Data
@NoArgsConstructor
@RequiredArgsConstructor
@Entity
@Table(name = "tags")
public class TagBE {
@Id
@NonNull
private long id;
@NonNull
private String name;
@ManyToMany
private List<PetBE> pets;
}
但是当我调用我的方法时,我得到了:
org.springframework.dao.InvalidDataAccessResourceUsageException: could not prepare statement; SQL [select petbe0_.id as id1_4_,petbe0_.category_id as category4_4_,petbe0_.name as name2_4_,petbe0_.status as status3_4_ from pets petbe0_ inner join tags tagbe1_ on where tagbe1_.name in (?)]; nested exception is org.hibernate.exception.SQLGrammarException: could not prepare statement
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT PETBE0_.ID AS ID1_4_,PETBE0_.CATEGORY_ID AS CATEGORY4_4_,PETBE0_.NAME AS NAME2_4_,PETBE0_.STATUS AS STATUS3_4_ FROM PETS PETBE0_ INNER JOIN TAGS TAGBE1_ ON WHERE[*] TAGBE1_.NAME IN (?)"; expected "NOT,EXISTS,INTERSECTS,UNIQUE"; SQL statement:
select petbe0_.id as id1_4_,petbe0_.status as status3_4_ from pets petbe0_ inner join tags tagbe1_ on where tagbe1_.name in (?) [42001-200]
我不知道从这里去哪里语法对我来说看起来不错。
查询也会编译,错误仅在运行时出现。
我在这里想念什么?
解决方法
通过不使用定义的关系,您将引入交叉联接(但是希望内部联接)。您可以在生成的查询的以下片段中看到它:
hstore
----------------------------
"a"=>"10000","b"=>"20000"
(1 row)
您可以通过将第二个实体用作第一个实体的字段来解决此问题:
inner join tags tagbe1_ on where tagbe1_.name in (?)
^
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。