public function readQueryResult($class)
 {
     $reflClass = new \ReflectionClass($class);
     $classAnnotations = $this->reader->getClassAnnotations($reflClass);
     $isQueryResult = false;
     foreach ($classAnnotations as $classAnnotation) {
         if ($classAnnotation instanceof QueryResult) {
             $isQueryResult = true;
         }
     }
     if (!$isQueryResult) {
         throw new \RuntimeException(sprintf('The class "%s" is not a valid QueryResult entity', $class));
     }
     $queryResultMapper = new QueryResultMapper($class);
     foreach ($reflClass->getProperties() as $property) {
         foreach ($this->reader->getPropertyAnnotations($property) as $propertyAnnotation) {
             if ($propertyAnnotation instanceof MappedResult) {
                 $queryResultMapper->addField(new ResultField($property->getName(), $propertyAnnotation->type, $propertyAnnotation->target));
             }
         }
     }
     return $queryResultMapper;
 }
 private function hydrateQueryRecord(QueryResultMapper $resultMapper, Record $record)
 {
     $reflClass = new \ReflectionClass($resultMapper->getClassName());
     $instance = $reflClass->newInstanceWithoutConstructor();
     foreach ($resultMapper->getFields() as $field) {
         if (!$record->hasValue($field->getFieldName())) {
             throw new \RuntimeException(sprintf('The record doesn\'t contain the required field "%s"', $field->getFieldName()));
         }
         $value = null;
         if ($field->isEntity()) {
             $value = $this->hydrate($record, false, $field->getFieldName(), ClassUtils::getFullClassName($field->getTarget(), $resultMapper->getClassName()));
         } else {
             $value = $record->get($field->getFieldName());
         }
         $property = $reflClass->getProperty($field->getFieldName());
         $property->setAccessible(true);
         $property->setValue($instance, $value);
     }
     return $instance;
 }