Hibernate Java - 意外的AST节点

时间:2018-06-05 13:15:40

标签: java hibernate

我正在使用Hibernate 5处理Spring Boot应用程序。我对存储库有一个自定义@Query

public interface TeamResourceRepository extends CrudRepository<ResourceItem, Integer> {

    @Query("Select i from ResourceItem as i JOIN i.resourceCategories as c WHERE c.ID = ?1")
    List<ResourceItem> findByCategory(int id);

    @Query("Select i from ResourceItem as i JOIN i.tags as t WHERE (t.description = ?1 "
            + " OR i.name LIKE  ?1%) AND i.isActive ORDER BY i.name")
    List<ResourceItem> findByTag(String search);
}

但是,我收到以下错误Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected AST node: . near line 1, column 138 [Select i from com.midamcorp.resource_server.model.ResourceItem as i JOIN i.tags as t WHERE (t.description = ?1 OR i.name LIKE ?1) AND i.isActive ORDER BY i.name]

我已经看了一些关于这个主题的其他问题,但似乎没有一个问题反映我的问题。所有似乎都是非常标准的SQL(JOIN,OR,LIKE等),所以我不确定问题出在哪里。

我使用MS SQL Server作为我的后端;任何建议将不胜感激。

修改

ResourceItem的代码

@Entity
@Table(schema = "Midamcorp", name = "ResourceItem")
public class ResourceItem {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int ID;

    @ManyToMany(mappedBy = "resources")
    private List<ResourceCategory> resourceCategories = new ArrayList<>();

    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    @JoinTable(name = "TagsResources", schema = "Midamcorp",
            joinColumns = @JoinColumn(name = "ResourceID", referencedColumnName = "ID"),
            inverseJoinColumns = @JoinColumn(name = "TagID", referencedColumnName = "ID"))
    private List<Tag> tags = new ArrayList<>();

    @OneToOne
    @JoinColumn(name = "FileID")
    private FileResource file;

    @Column(name = "Name")
    private String name;

    @Column(name = "IsActive")
    private boolean isActive;

    public ResourceItem() {

    }

    public ResourceItem(int iD, List<Tag> tags, FileResource file, String name) {
        ID = iD;
        this.tags = tags;
        this.file = file;
        this.name = name;
    }

// getters and setters here }

2 个答案:

答案 0 :(得分:1)

编写整个查询,如例外:

Select i from com.midamcorp.resource_server.model.ResourceItem as i JOIN i.tags as t WHERE (t.description = ?1  OR i.name LIKE  ?1) AND i.isActive ORDER BY i.name 

并查看列138存在问题的错误,而不是您应该查看i.isActive。我想i.isActive = true会修复它。

答案 1 :(得分:-1)

问题可能出在带有param子句的LIKE中。 尝试将param与通配符连接起来:

OR i.name LIKE  CONCAT(?1,'%')