1

製品リスト用の単純な索引付けシステムを構築しています。キーワードと製品 ID の表と、キーワードと製品の関連性を示すスコアがあります。

CREATE TABLE item_index (
  keyword varchar(50) NOT NULL,
  item_id int NOT NULL,
  score int NOT NULL,
  INDEX keyword_index (keyword)
);

(item_id は実際には item テーブルへの外部キーであり、ここには示されていません。)

SQL では、次のようにインデックスをクエリします。

SELECT item_id,score FROM item_index WHERE keyword=? ORDER BY score DESC;

これにより、キーワードに関連する項目 ID のリストが、関連性の高い順に表示されます。

私の質問は次のとおりです。JPAを使用してこれを行うにはどうすればよいですか?

私の試みは次のとおりです。

@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 */
}

JPA (私の場合は Hibernate) ではエンティティに ID フィールドが必要なため、このアプローチは機能しません。テーブルがクエリされる唯一の方法はSELECT上記のステートメントのとおりであるため、一意の ID は必要ありません。

Item エンティティにキーワードを保存したくないことに注意してください。Item は、インデックス作成システムの知識を持たない必要があります。

{item_id,score} タプルの新しいテーブルを含むソリューションを想定できますが、上記の 1 つのテーブルだけを使用してそれを行うことが可能でしょうか?

助けてくれてありがとう!

4

1 に答える 1

2

テーブルには、とitem_indexで構成される複合 ID があるようです。私の理解が正しければ、これらのペアはテーブル内で一意です。これは、これをテーブルの主キーとして定義し、エンティティの複合 ID として使用できることを示しています。item_idkeyword

複合 ID の定義に関するヘルプについては、JPA 複合主キーを参照してください。こちらの記事も参考になります。

于 2013-05-21T14:22:47.390 に答える