2016-07-15 9 views
2

私はProductUsageとLearnerという2つのテーブルを持っています。 ProductUsageにはフィールドLearnerがあり、LearnerにはフィールドIDとGUIDがあります。今私は、学習者のGUID指定されたユーザーIDであるすべてのproductUsageを引き出すために、クエリを作成する必要があります。複数の結合テーブルのスプリングデータjpa

SQL:

select * from product_usage 
inner join learner 
on product_usage.learner_id = learner.id 
where 
learner.guid in ("1234", "2345") 

ドメインクラス:

@Data 
@NoArgsConstructor 
@Entity 
@Table(name = "core_product_usage_increments") 
public class ProductUsage { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name = "learner_id", nullable = false) 
    private Learner learner; 

    @ManyToOne 
    @JoinColumn(name = "learning_language_id", nullable = false) 
    private Language language; 
} 

@Data 
@NoArgsConstructor 
@Entity 
@Table(name = "learners") 
public class Learner { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Column(name = "user_guid", nullable = false, unique = true) 
    private String guid; 

    @Column(name = "first_name") 
    private String firstName; 

    @Column(name = "last_name") 
    private String lastName; 
} 

とリポジトリクラス:

@Repository 
public interface ProductUsageRepository extends CrudRepository<ProductUsage, Integer> { 
    @Query("SELECT p FROM ProductUsage p WHERE p.learnerGuid = :learnerGuid") 
    List<ProductUsage> findByLearnerGuid(String learnerGuid); 
} 

リポジトリを呼び出すクライアントクラス

@Component 
public class MyClient { 
    @Autowired 
    private ProductUsageRepository repository; 

    public MyClient(ProductUsageRepository repository) { 
     this.repository = repository; 
    } 

    public List<ProductUsage> getProductUageByLeanrerGuid(String learnerGuid) { 
     return repository.findByLearnerGuid(learnerGuid); 
    } 
} 

と私のテスト:

@Test 
    public void testClient() throws Exception { 
     MyClient client = new MyClient(repository); 
     List<ProductUsage> results = client.getProductUageByLeanrerGuid("1234"); 
     assertNotNull(result); 
    } 

と、それは失敗しました:

Caused by: java.lang.IllegalArgumentException: org.hibernate.QueryException: could not resolve property: learnerGuid of: com.acme.domain.spectrum.ProductUsage [SELECT p FROM com.acme.domain.spectrum.ProductUsage p WHERE p.learnerGuid = :learnerGuid] 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1364) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1300) 
    at org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:294) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 

それはProductUsageに 'learnerGuid' フィールドを認識することはできませんが、それは実際に学習者のクラスで定義されています。複数のテーブルを結合するクエリを実行するにはどうすればよいですか?

答えて

1

ProductUsageにはlearnerGuidというプロパティがありません。learnerのみです。

@Query("SELECT p FROM ProductUsage p join p.Learner l WHERE l.guid = :learnerGuid") 
:問題が解決しない場合、私は別のチップを持って

@Query("SELECT p FROM ProductUsage p WHERE p.learner.guid = :learnerGuid") 

をお試しください

関連する問題