2016-07-15 4 views
2

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?

Antwort

1

ProductUsage hat keine learnerGuid Eigenschaft, nur learner. Versuchen

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

Wenn das nicht funktioniert, ich habe einen anderen Tipp:

@Query("SELECT p FROM ProductUsage p join p.Learner l WHERE l.guid = :learnerGuid") 
Verwandte Themen