Параметризованный запрос PostgreSQL в репозитории Spring

Я использую структуру Spring и базу данных PostgreSQL. В следующем запросе я хочу выбрать те строки, в которых имя продукта соответствует параметру «ключевое слово». Когда я запускаю следующий запрос, он дает мне следующую ошибку

Кто-нибудь скажет мне, как написать правильный запрос?

Запрос:

@Query(value="Select pp from product_photo pp join products p ON pp.product_id=p.id Where p.name ~* ?Keyword",nativeQuery = true)
    List<ProductPhoto> trail(@Param("keyword")String Keyword);

API:

http://localhost:8080/productPhotos/search/trail?keyword=Bottles

Ошибка:

could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet

Сущность продукта

@Entity
@Table(name="products")
public class Product implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @SequenceGenerator(name="SEQ_PRODUCTS", sequenceName="PRODUCTS_SEQ", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_PRODUCTS")
    private Long id;

    @NotEmpty
    @Column(name="NAME", nullable=false)
    private String name;

    @Column(name="DESCRIPTION",length=1000)
    private String description;

    @Column(name="PRICE", nullable=false)
    private Double price;

    private String SKU;

    private String supplierCode;

    private String readerOfferCode;

    private float productWeight;

    private Boolean statusEnabled=true;

    private float quantity;

    public String barcode;

    private boolean featuredProduct;

    private Double meanRating;

    private Double discountedPrice;

    @Enumerated(EnumType.STRING)
    private stockStatus stockStatus;

    @ManyToOne 
    private Supplier supplier;

    @ManyToOne (fetch = FetchType.EAGER)
    private ProductCategory productCategory;

    @ManyToOne
    private ProductDepartment productDepartment;

    @JsonIgnore
    @OneToMany(mappedBy="product",targetEntity=ProductPhoto.class,fetch = FetchType.EAGER)
    private List<ProductPhoto> pictures;
    ..// Getters and setters 
    }

Объект ProductPhoto

@Entity
public class ProductPhoto implements Serializable {

    private static final long serialVersionUID = 1L;

        @Id
        @GeneratedValue(strategy=GenerationType.IDENTITY)
        private Long id;

        //@JsonIgnore
        @ManyToOne 
        private Product product;

        private String path;

        private Boolean primaryPhoto=false;

        @Column( nullable = false, updatable = false, insertable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
        @Temporal(TemporalType.TIMESTAMP)
        private Date uploadDate ;
        //..getters and setters }

person SFAH    schedule 08.11.2017    source источник
comment
Можете ли вы показать нам свои сущности, пожалуйста?   -  person YCF_L    schedule 08.11.2017
comment
@YCF_L Проверить отредактированный вопрос   -  person SFAH    schedule 08.11.2017
comment
@ScaryWombat LIKE в PostgreSQL чувствителен к регистру, и я хочу сопоставить ключевое слово без учета регистра, поэтому я использовал это   -  person SFAH    schedule 08.11.2017
comment
попробуйте использовать @ManyToOne @JoinColumn(name="id") private Product product;   -  person YCF_L    schedule 08.11.2017
comment
@YCF_L Я запускаю следующий запрос из базы данных, и он работает нормально, поэтому я не думаю, что это проблема id .. Что вы думаете? Выберите pp из product_photo pp join products p ON pp.product_id=p.id Где p.status_enabled='true' AND pp.primary_photo='true' AND (p.name ~* 'бутылки');   -  person SFAH    schedule 08.11.2017
comment
пожалуйста, измените ?keyword на :keyword или ?1, я не вижу до чего-то вроде ?NameOfKeyWord   -  person YCF_L    schedule 08.11.2017
comment
LIKE в PostgreSQL чувствителен к регистру, и я хочу сопоставить ключевое слово без учета регистра, поэтому я использовал это. Чтобы ответить на этот вопрос, используйте что-то вроде этого для нечувствительности к регистру: Select pp from product_photo pp join products p ON pp.product_id=p.id Where UPPER(p.name) LIKE UPPER('%yourkeyword%')   -  person hiren    schedule 08.11.2017
comment
@ScaryWombat ОП использует nativeQuery = true, значит, он/она может использовать ~   -  person YCF_L    schedule 08.11.2017
comment
@YCF_L Извините, я пропустил nativeQuery = true   -  person Scary Wombat    schedule 08.11.2017
comment
@HirenPandit Теперь, когда я запускаю запрос, он выдает следующую ошибку Parameter with that position [1] did not exist; nested exception is java.lang.IllegalArgumentException   -  person SFAH    schedule 08.11.2017
comment
попробуйте использовать p.name ~ :keyword   -  person YCF_L    schedule 08.11.2017
comment
LIKE, конечно, чувствителен к регистру, а ILIKE — нет.   -  person Kayaman    schedule 08.11.2017
comment
вопрос в том, что вы имели в виду под p.name ~* ?Keyword, что вы хотите сопоставить?   -  person YCF_L    schedule 08.11.2017
comment
Вы уверены, что это не проблема с именем параметра keyword и в запросе, который вы используете с заглавной буквы Keyword?   -  person Kayaman    schedule 08.11.2017
comment
Следующий запрос работает отлично. Спасибо всем за помощь, особенно @HirenPandit @Query("Select pp from ProductPhoto pp join pp.product p where pp.product.id=p.id AND p.statusEnabled='true' AND pp.primaryPhoto='true' AND (UPPER(p.name) LIKE UPPER(%:keyword%) or p.description LIKE %:keyword%)")   -  person SFAH    schedule 08.11.2017
comment
Вы действительно должны использовать ILIKE вместо LIKE с UPPER.   -  person Kayaman    schedule 08.11.2017
comment
@Kayaman Конечно, я тоже попробую   -  person SFAH    schedule 08.11.2017
comment
Нет попытки. LIKE — сравнение с учетом регистра, ILIKE — сравнение без учета регистра. Использование UPPER — это просто признак плохого программиста, который не понимает, что он делает с базой данных.   -  person Kayaman    schedule 08.11.2017
comment
@Kayaman Я пытался, но выдает ошибку @Query(value="Select pp from product_photo pp join products p ON pp.product_id=p.id Where p.status_enabled='true' AND pp.primary_photo='true' AND p.name ILIKE :%Keyword%)",nativeQuery = true) Ошибка: не найдена привязка параметра для ключевого слова имени!   -  person SFAH    schedule 08.11.2017
comment
Это потому, что вы снова написали имя параметра в верхнем регистре Keyword не keyword. Вы же не думали, что я говорю о регистре имени параметра, не так ли? Кроме того, вы поставили точку с запятой не с той стороны %. О, да ладно, ты пишешь это вслепую или что?   -  person Kayaman    schedule 08.11.2017
comment
@Kayaman Я написал ключевое слово в верхнем регистре, потому что я взял имя параметра в верхнем регистре ... О, да ладно, ты читаешь это вслепую или что-то в этом роде?   -  person SFAH    schedule 08.11.2017
comment
В вашем коде есть @Param("keyword") в нижнем регистре. А как насчет части :%? В вашем рабочем коде вы используете %:, так почему вы вдруг все это изменили? Обратите немного внимания на то, что вы пишете.   -  person Kayaman    schedule 08.11.2017
comment
@Kayaman О М Г серьезно? Я не знаю, почему ты такой агрессивный? ЭТО ПРОСТО ОБСУЖДЕНИЕ а не мировая война!! уф... Чувак, иди и возьми стакан воды   -  person SFAH    schedule 08.11.2017
comment
SO - это не дискуссионный форум, это сайт QA. Между :%Keyword% и %:keyword% есть очень очевидная разница. Не сердитесь, что я указал, что вы пишете наугад. Это только поможет вам, потому что вы будете уделять больше внимания тому, что вы пишете, и вам не придется просить помощи каждый раз, когда вы делаете опечатку в своем коде.   -  person Kayaman    schedule 08.11.2017
comment
@Kayaman Это не проблема опечатки .. до этого вы тоже были очень высокомерны .. Кстати, СПАСИБО!   -  person SFAH    schedule 08.11.2017
comment
Нет проблем, рад, что вы смогли исправить свою ошибку.   -  person Kayaman    schedule 08.11.2017


Ответы (1)


Хорошо. С помощью приведенных выше комментариев я могу выполнить правильный запрос.

@Query("Select pp from ProductPhoto pp join pp.product p where pp.product.id=p.id "
        + "AND p.statusEnabled='true' AND pp.primaryPhoto='true' "
        + "AND (UPPER(p.name) LIKE UPPER(%:keyword%) OR p.description LIKE %:keyword%)")
List<ProductPhoto> sqlLike(@Param("keyword") String Keyword);
person SFAH    schedule 08.11.2017
comment
как насчет p.name ~ :keyword ты пробовал? - person YCF_L; 08.11.2017