多向一对多JPQL选择外键

时间:2017-07-24 11:53:58

标签: jpa criteria-api

我阅读了不同的帖子,但我找不到有效的解决方案。我认为OneToMany关系会导致问题。我必须遵循以下实体:

 // Mandant.class (client)
 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
 @JoinColumn(name = "FK_MANDANT")
 private List<Leistung> leistungen = new ArrayList<>();

 // Mitarbeiter.class (employee)
 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
 @JoinColumn(name = "FK_MITARBEITER")
 private List<Leistung> leistungen = new ArrayList<>();

 // Kategorie.class (category)
 @OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
 @JoinColumn(name = "FK_KATEGORIE")
 private List<Leistung> leistungen = new ArrayList<>();

undirectional OnetoMany个关系。我在filterLeistungen(...)中写了一个方法LeistungsRepository.class。现在我想通过模糊的过滤器来过滤付款(Leistungen)。所以我将过滤器与Stringbuilder复合到JPQL-Select

 sb.append("l.mandant = ");
 sb.append(mandant.getId());
 sb.append(" AND ");

现在我使用createQuery()创建一个查询。

 EntityManager entityManager = PREntityManagerFactory.getInstance().createEntityManager();
 RepositoryUtils<List<Leistung>> repositoryUtils = new RepositoryUtils<>();
 JpaFunction<List<Leistung>> function = () -> 
 entityManager.createQuery(sb.toString(), Leistung.class).getResultList();
 return repositoryUtils.withoutTransaction(entityManager, function);

但是当我执行查询时,我得到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Problem compiling [SELECT l FROM Leistung l WHERE l.fakturierungsdatum IS NULL AND l.mandant = 1 ORDER BY l.datum]. 
[64, 73] The state field path 'l.mandant' cannot be resolved to a valid type.

我还尝试了l.mandant.idl.fk_mandant.idl.fk_mandant。我使用EclipseLink和MySQL数据库。所有实体都有一个名为id的主键。是否可以通过外键过滤付款(Leistungen)?由于不定向关系,付款不知道其他实体。但是在数据库上,付款具有外键属性,所以应该可以吗?

1 个答案:

答案 0 :(得分:0)

我在德国论坛上得到了一个提示。使用createNativeQuery()方法,我可以使用数据库方言,这里是MySQL。但我认为这不是一个非常好的解决方案,因为无法保证平台的独立性。