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.
Gelöst: Beitreten category = from.join ("Kategorien"); –
Richard
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 –