Ich habe zwei Tabellen: ProductUsage und Learner. ProductUsage hat field Learner, Learner hat fields id und guid. jetzt brauche ich eine Abfrage zu erstellen, ziehen Sie guid alle productUsage deren Lernende ist in der angegebenen Benutzer-IDs:Federdaten jpa für mehrere verbundene Tabelle
SQL:
select * from product_usage
inner join learner
on product_usage.learner_id = learner.id
where
learner.guid in ("1234", "2345")
Domain-Klasse:
@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;
}
und Repository-Klasse:
@Repository
public interface ProductUsageRepository extends CrudRepository<ProductUsage, Integer> {
@Query("SELECT p FROM ProductUsage p WHERE p.learnerGuid = :learnerGuid")
List<ProductUsage> findByLearnerGuid(String learnerGuid);
}
Client-Klasse, die das Repository aufrufen
@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);
}
}
und mein Test:
@Test
public void testClient() throws Exception {
MyClient client = new MyClient(repository);
List<ProductUsage> results = client.getProductUageByLeanrerGuid("1234");
assertNotNull(result);
}
und es ist fehlgeschlagen:
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)
es nicht erkennen kann, die 'learnerGuid' Feld in ProductUsage, aber das ist eigentlich in Learner-Klasse definiert. Wie kann ich die Abfrage ausführen, die mehreren Tabellen beitritt?