Я использую структуру 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 }
@ManyToOne @JoinColumn(name="id") private Product product;
- person YCF_L   schedule 08.11.2017id
.. Что вы думаете? Выберите 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?keyword
на:keyword
или?1
, я не вижу до чего-то вроде?NameOfKeyWord
- person YCF_L   schedule 08.11.2017Select 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.2017nativeQuery = true
, значит, он/она может использовать~
- person YCF_L   schedule 08.11.2017nativeQuery = true
- person Scary Wombat   schedule 08.11.2017Parameter with that position [1] did not exist; nested exception is java.lang.IllegalArgumentException
- person SFAH   schedule 08.11.2017p.name ~ :keyword
- person YCF_L   schedule 08.11.2017LIKE
, конечно, чувствителен к регистру, аILIKE
— нет. - person Kayaman   schedule 08.11.2017p.name ~* ?Keyword
, что вы хотите сопоставить? - person YCF_L   schedule 08.11.2017keyword
и в запросе, который вы используете с заглавной буквыKeyword
? - person Kayaman   schedule 08.11.2017@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.2017ILIKE
вместоLIKE
сUPPER
. - person Kayaman   schedule 08.11.2017LIKE
— сравнение с учетом регистра,ILIKE
— сравнение без учета регистра. ИспользованиеUPPER
— это просто признак плохого программиста, который не понимает, что он делает с базой данных. - person Kayaman   schedule 08.11.2017@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.2017Keyword
неkeyword
. Вы же не думали, что я говорю о регистре имени параметра, не так ли? Кроме того, вы поставили точку с запятой не с той стороны%
. О, да ладно, ты пишешь это вслепую или что? - person Kayaman   schedule 08.11.2017@Param("keyword")
в нижнем регистре. А как насчет части:%
? В вашем рабочем коде вы используете%:
, так почему вы вдруг все это изменили? Обратите немного внимания на то, что вы пишете. - person Kayaman   schedule 08.11.2017:%Keyword%
и%:keyword%
есть очень очевидная разница. Не сердитесь, что я указал, что вы пишете наугад. Это только поможет вам, потому что вы будете уделять больше внимания тому, что вы пишете, и вам не придется просить помощи каждый раз, когда вы делаете опечатку в своем коде. - person Kayaman   schedule 08.11.2017