2016-07-25 9 views
2

verbinden Ich verwende Java 8 mit JPA (Hibernate 5.2.1). Ich habe eine Like-Klausel, die perfekt funktioniert, bis ich die Like-Klausel einführe, um auch die Werte der Fremdschlüsseltabelle zu verwenden.BasicPathUsageException: Kann nicht mit Attribut des Basistyps

Ich erhalte die folgende Fehlermeldung:

BasicPathUsageException: Cannot join to attribute of basic type

denke ich, das Problem mit der Tatsache zusammenhängt, dass ich einen Tisch kommen, und ich bin nicht sicher, wie die LIKE erstellen Treten Sie der Join-Tabelle verwenden.

Mitarbeiter - employee_category - Kategorie

Modell (Employee.java):

@ManyToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
@JoinTable 
(
    name="employee_category", 
    joinColumns={ @JoinColumn(name="EMP_ID", referencedColumnName="ID") }, 
    inverseJoinColumns={ @JoinColumn(name="CAT_ID", referencedColumnName="ID") } 
) 
private Set<Category> categories; 

Modell (Category.java):

@Id 
private String id; 

JPA

Wenn ich vorstellen die folgenden Code schlägt der obige Fehler fehl Code):

Join<T, Category> category = from.join("id"); 
predicates.add(criteriaBuilder.like(category.<String>get("name"), "%" + searchQuery + "%")); 

Dies ist das gesamte Verfahren:

protected List<T> findAllCriteria(String[] orderByAsc, String[] orderByDesc, Class<T> typeParameterClass, 
     int firstResult, int maxResults, String searchQuery) { 
    CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(typeParameterClass); 

    // from 
    Root<T> from = criteriaQuery.from(typeParameterClass); 
    criteriaQuery.select(from); 

    // like 
    if (searchQuery != null && searchQuery.trim().length() > 0) { 

     List<Predicate> predicates = new ArrayList<Predicate>(); 
     for (String name : getColumnNames(typeParameterClass)) { 
      Predicate condition = criteriaBuilder.like(from.<String>get(name), "%" + searchQuery + "%"); 
      predicates.add(condition); 
     } 
     Join<T, Category> category = from.join("id"); 
     predicates.add(criteriaBuilder.like(category.<String>get("name"), "%" + searchQuery + "%")); 

     criteriaQuery.where(criteriaBuilder.or(predicates.toArray(new Predicate[] {}))); 
    } 

    List<T> results = (List<T>) entityManager.createQuery(criteriaQuery).setFirstResult(firstResult) 
      .setMaxResults(maxResults).getResultList(); 
    return results; 
} 

Jede Hilfe geschätzt wird.

+0

Gelöst: Beitreten category = from.join ("Kategorien"); – Richard

+0

Wenn es "gelöst" ist, dann posten Sie eine ANTWORT auf Ihre Frage und akzeptieren Sie die Antwort. Dann kommen die Leute nicht auf diese Frage und denken, sie könnten sie beantworten –

Antwort

0

Gelöst: Beitritt Kategorie = from.join ("Kategorien");

Verwandte Themen