Je construis un système d'indexation simple pour une liste de produits. J'ai une table de mots-clés et les ID de produit, et une note indiquant la pertinence du mot-clé du produit:JPA modélisant une table sans ID d'entité
CREATE TABLE item_index (
keyword varchar(50) NOT NULL,
item_id int NOT NULL,
score int NOT NULL,
INDEX keyword_index (keyword)
);
(item_id est en fait une clé étrangère à la table d'éléments, non représentés ici.)
dans SQL j'interrogerait l'index comme suit:
SELECT item_id,score FROM item_index WHERE keyword=? ORDER BY score DESC;
Cela me donne une liste d'élément ID correspondant au mot-clé, par ordre de pertinence.
Ma question est: Comment puis-je faire cela en utilisant JPA?
Ma tentative est la suivante:
@Entity
@Table(name="item_index")
@NamedQueries({
@NamedQuery(name="ItemIndex.findByWord", query="SELECT i from ItemIndex i WHERE i.keyword=:keyword ORDER BY i.score DESC"),
@NamedQuery(name="ItemIndex.deleteAll", query="DELETE FROM ItemIndex")
})
public class ItemIndex implements Serializable
{
private static final long serialVersionUID = 1L;
@Column(name = "keyword", length=50)
private String keyword;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "item_id")
private Item item;
@Column(name = "score")
private int score;
/* Getters and setters not shown */
}
Cette approche ne fonctionne pas parce que JPA (mise en veille prolongée dans mon cas) exige que l'entité a un champ d'identification. Je n'ai pas besoin d'un ID unique, car la seule façon de demander la table est la suivante: SELECT
Notez que je ne veux pas stocker les mots-clés dans l'entité Item - l'élément ne devrait pas avoir connaissance du système d'indexation.
Je peux envisager des solutions impliquant une nouvelle table de tuples {item_id, score}, mais je me demande s'il est possible de le faire en utilisant juste le tableau ci-dessus?
Merci pour toute aide!
Merci, l'article a aidé. (Je ne pensais pas que les lignes de cette table étaient des entités, mais c'est ce qu'elles sont!) – Alex