2013-05-21 2 views
1

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!

Répondre

2

La table item_index semble avoir un ID composé, constitué de item_id et de keyword. Si je comprends bien, ces paires sont uniques dans votre tableau. Cela indique que vous pouvez définir cela comme clé primaire de votre table et l'utiliser comme identifiant composite de votre entité.

Jetez un oeil à JPA composite primary key pour obtenir de l'aide concernant la définition d'un ID composite. This article pourrait aussi être utile.

+0

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