Hibernate Java - неожиданный узел AST - PullRequest
0 голосов
/ 05 июня 2018

Я работаю над приложением Spring Boot, использующим Hibernate 5. У меня есть пользовательский @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 голосов
/ 05 июня 2018

Запись всего запроса, как в исключении:

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 это исправит.

0 голосов
/ 05 июня 2018

Проблема может быть в LIKE с предложением param.Попробуйте объединить параметр с подстановочным знаком:

OR i.name LIKE  CONCAT(?1,'%')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...