2016-10-31 2 views
0

ich eine Ausnahme CAN_NOT_JOIN_TO_BASIC auf meine PPV Kriterien API-Abfrage bin immer:JPA Kriterien api beitreten: CAN_NOT_JOIN_TO_BASIC

@Entity 
    public class Connection { 
     @Id 
     private String id; 
     private String sourceNodeId; 
     private String targetNodeId; 
    } 

    @Entity 
    public class Node { 
     @Id 
     private String id; 
     private String graphId; 
    } 

ich alle Verbindungen, die zu einem bestimmten Graphen abrufen möchten. Die Abfrage:

final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
    CriteriaQuery<Connection> query = cb.createQuery(Connection.class); 
    Root<Connection> connection = query.from(Connection.class); 
    Join<Connection,Node> node = connection.join("sourceNodeId"); 
    TypedQuery<Connection> typedQuery = entityManager.createQuery(query 
      .select(connection) 
      .where(cb.equal(joiningSequenceObject.get("graphId"), someId))); 

    return typedQuery.getResultList(); 

Was mache ich falsch? Hilfe geschätzt!

Antwort

0

Um die JPQL JOIN oder die entsprechenden From.join() Methoden aus der Kriterien-API zu verwenden, müssen die Entitäten über eine Beziehung verbunden sein. Eine vernünftige Option ist also, Connection mit Node in Beziehung zu setzen.

Wenn dies nicht möglich ist, können Sie die einfache Join-Syntax verwenden:

SELECT c 
FROM Connection c, Node n 
WHERE (c.sourceNodeId = n.id OR c.targetNodeId = n.id) 
    AND n.graphId = :graphId 

Oder Kriterien API so etwas wie:

final CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Connection> query = cb.createQuery(Connection.class); 
Root<Connection> connection = query.from(Connection.class); 
Root<Node> node = query.from(Node.class); 
TypedQuery<Connection> typedQuery = entityManager.createQuery(query 
     .select(connection) 
     .where(
      cb.and(
       cb.or(
        cb.equal(connection.get("sourceNodeId"), node.get("id")), 
        cb.equal(connection.get("targetNodeId"), node.get("id")) 
       ), 
       cb.equal(node.get("graphId"), someId) 
      ) 
     ); 

return typedQuery.getResultList(); 
+0

ok, danke. Also müsste ich eine Annotation hinzufügen. Ist das für die obige Struktur möglich, oder müsste ich sourceNodeId durch eine Objektreferenz für ein Knotenobjekt ersetzen? – robbit

+0

Ja, z.B. die 'String sourceNodeId' sollte durch' Node source' mit der richtigen Annotation, '@ ManyToOne' wahrscheinlich ersetzt werden. –