2017-06-21 9 views
0

は、このクラスを考えてみましょうこれは難しい部分です。 "Customer"に関連するUserActivityタイプのすべてのオブジェクトを取得したい。私はこのような何か試してみました:

public interface UserActivityRepository extends PagingAndSortingRepository<UserActivity,UUID> { 
    @Query("select u from UserActivity u join Customer.id") 
    List<UserActivity> findAllByUserIsNotNullOrderByCreatedDesc(Pageable pageable); 
} 

をしかしHibernateは、私は無効なパスを指定したことを私に伝えます。

私にこれを教えてもらえますか?

答えて

1

:現代のデータベースでオプティマイザがするように、あなたがより良い好きなピック

  1. select u from UserActivity u, Customer c where u.user.id = c.id
  2. select u from UserActivity u where u.user.id in (select id from Customer)

どちらの場合でもパフォーマンスが同じになるように両方のクエリを最適化します。

0

Userエンティティに@DiscriminatorColumn(name = "TYPE")を使用してください。

@Entity 
@Table(name = "USER_TABLE") 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name = "TYPE") 
@DiscriminatorValue("USER") 
public class User { 

    ... 

} 

は次のようにあなたの Customerエンティティ

@Entity 
@Table(name = "CUSTOMER") 
@DiscriminatorValue("CUSTOMER") 
public class Customer extends User { 

    ... 

} 

クエリリポジトリに@DiscriminatorValue("CUSTOMER")を定義しますので

@Query("select u from UserActivity u join u.user user where TYPE(user) = 'CUSTOMER'") 
List<UserActivity> findAllByUserIsNotNullOrderByCreatedDesc(); 

注:@DiscriminatorValue注釈は必須ではありません。 JPAはエンティティタイプに基づいて列名を推論します。

あなたが明示的に Customer IDに属し User IDによって Customerまたはフィルタに参加することができ
+0

TypeはDiscriminatorValueではなくエンティティ名を取ります。 https://stackoverflow.com/questions/3765948/how-do-i-query-for-only-superclass-entities-in-a-jpjp-query – Chris

+0

はい、あります。だからこそ 'TYPE(user)'です。 userはマッピングされたエンティティです。 –

+0

プロバイダがサポートしていることは素晴らしいですが、JPAでは、識別パラメータ列として使用されている値またはクラスの決定に使用されているメカニズムを、実際のタイプから分離する入力パラメータとしてエンティティクラスが必要です。そのタイプに関するあなたの答えは正しいですが、Discriminatorアノテーションをまったく指定する必要はなく、クラスを使用するだけです。 – Chris