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