0

私は最近Hibernateの使用を開始し、すべての注釈に頭を悩ませて、適切に処理できるようにしようとしています。以下のような2つのテーブル「user」と「user_friends」があります

+------+------+-------+------+
| id   | name | email | etc. |
+------+------+-------+------+

とユーザーの友達テーブル

+--------+---------+----------+
| userid | buddyid | accepted |
+--------+---------+----------+

SQLで、次のようなクエリを実行しました。

SELECT u.id AS id, u.name AS username, u.email AS email FROM user_friends 
INNER JOIN users AS u ON u.id = '1' WHERE buddyid = '2' AND ACCEPTED = 1 UNION ALL 
SELECT u.id as id, u.name AS username, u.email AS email FROM user_friends
INNER JOIN users AS u ON u.id = '2' WHERE buddyid = '1' AND ACCEPTED = 1;

これに似た方法でJavaセットアップに2つのクラスがあります

@Entity
@Table(name="users")
public class User {

  @Id
  @GeneratedValue
  private int id;

  private int name;
  private int email;

  private DateTime registerDate;
  private DateTime lastActivity;

  private int currency;
  private int seasonCurrency;

  @OneToMany(fetch=UserBuddy.class, mappedBy="user", fetch=FetchType.LAZY)
  @JoinColumn(name="userid")
  @Filter(name="messengerBuddyFilter", condition="accepted=1")
  private Set<UserBuddy> _buddies;
}

@Entity
@Table(name="user_friends")
public class UserBuddy {

   private int id;
   private int name;
   private int email;
}

私は以前にこの質問をしましたが、それでも私が望むようにこれを機能させることができませんでした。そのバディの名前と電子メールを含み、登録時間などではなく、他には何も含まないUserBuddy.classのセットを返すことができる必要があります(ユーザークラスを使用してマップします)。また、リクエストを受け入れたバディのみを返すようにするのも困難です(ACCEPTED = 1)

誰かが何か提案をすることができますか?

4

1 に答える 1

0

JPAを使用している場合(および休止状態とJPAで名前付きネイティブクエリに問題がある場合)はネイティブクエリを使用する必要があり、純粋な休止状態のみを使用している場合はIIRCsqlクエリを使用する必要があります。

これはうまくいくかもしれません...これをすばやく行うだけで、開始する場所として使用してください。クラスメンバー変数として定義されたemという名前のJPAにエンティティマネージャーがあるとします。

@PersistenceContext(unitName = "MyPersistenceUnit_PU")
private EntityManager em;

..。

いくつかの方法...

List<UserBudy> buddyList = new <>ArrayList();
Query q = createNativeQuery("SELECT u.id AS id, u.name AS username, u.email AS email "
                          + "FROM user_friends "
                          + "INNER JOIN users AS u "
                          + "ON u.id = '1' "
                          + "WHERE buddyid = '2' "
                          + "AND ACCEPTED = 1 "
                          + "UNION ALL "
                          + "SELECT u.id as id, u.name AS username, u.email AS email "
                          + "FROM user_friends "
                          + "INNER JOIN users AS u "
                          + "ON u.id = '2' "
                          + "WHERE buddyid = '1' "
                          + "AND ACCEPTED = 1");
List<UserBudy> buddyList = (List<UserBudy>)em.getResultList);

この例は、「名前付き」のネイティブクエリではありません。これは、POJDBC(プレーンな古いjdbc)と同様にインラインで実行されます。私が言ったように、JPAとHibernateを使用してNamedNativeQueryを作成しようとすると、「何かまたは他のまだ実装されていない例外」が発生します。Hibernateは、JPAを使用した名前付きネイティブクエリを永久にサポートしていません。それはまだどこかで彼らのバグトラッカーにあり(すでに5年か6年の間)、彼らはそれを修正することについてネズミのお尻を与えていないようです。ただし、全体として、PostgreSQLを使用する場合のHibernateの問題はEclipselinkを使用する場合よりも少ないため、今のところは我慢できます。:)

IIRCでこれを純粋な休止状態で行う場合は、JPA EMオブジェクトの代わりにHibernateセッションオブジェクトを作成し、代わりにcreateSQLQueryを使用します。それ以外はほぼ同じです。

すなわち

session.createSQLQuery("...");

これで十分に役に立たなかった場合は、少なくともそれを理解するのに十分な情報が必要です。

そして、純粋なJPAを使用した後、自分が何であるかを試してみたい場合は、ここにリンクがあります。この記事の約半分のところにある「広告申込情報の概要」の例を探してください。

http://www.oracle.com/technetwork/articles/vasiliev-jpql-087123.html

JPAを扱うときは、テーブルではなくエンティティを結合していることを忘れないでください。とにかく、その記事は私が今までに見つけた中で最も明確なものの1つであり、その多くがどのように機能するかを示しています。よろしく。

于 2012-07-13T18:51:03.950 に答える