0

У меня есть два класса - Employee и работа - как доменКак получить список внутренних объектов?

public class Employee { 
    private Long id; 
    private String name; 
    private List<Job> jobList = new ArrayList<>(); 
    private Week week; 

    public Employee() { 
    } 

    public Employee(String name) { 
     this.name = name; 
     jobList.add(new Job("Haircut", 30, 300)); 
     week = Week.init(); 
    } 
//Getters and setters for all fields. 
} 

public class Job { 
    private Long id; 
    private String title; 
    private int duration; 
    private int price; 

    public Job() { 
    } 

    public Job(String title, int duration, int price) { 
     this.duration = duration; 
     this.price = price; 
     this.title = title; 
    } 
//Getters and setters for all fields. 
} 

и как бэкэнд

@Entity 
public class Employee { 
    @Id 
    private Long id; 
    private String name; 
    private List<Job> jobList = new ArrayList<>(); 
    private Week week; 

    public Employee() { 
    } 
    //Getters and setters for all fields. 
} 

@Entity 
public class Job { 
    @Id 
    private Long id; 
    private String title; 
    private int duration; 
    private int price; 

    public Job() { 
    } 
    //Getters and setters for all fields. 
} 

зарегистрирован в OfyService

public class OfyService { 

    static { 
     factory().register(Employee.class); 
     factory().register(Job.class); 
    } 

    public static Objectify ofy() { 
     return ObjectifyService.ofy(); 
    } 

    public static ObjectifyFactory factory() { 
     return ObjectifyService.factory(); 
    } 
} 

Есть два метода в моем EmployeeEndpoint:

@ApiMethod(
    name = "list", 
    path = "employee", 
    httpMethod = ApiMethod.HttpMethod.GET) 
public CollectionResponse<Employee> list(@Nullable @Named("cursor") String cursor, @Nullable @Named("limit") Integer limit) { 
    limit = limit == null ? DEFAULT_LIST_LIMIT : limit; 
    Query<Employee> query = OfyService.ofy().load().type(Employee.class).limit(limit); 
    if (cursor != null) { 
     query = query.startAt(Cursor.fromWebSafeString(cursor)); 
    } 
    QueryResultIterator<Employee> queryIterator = query.iterator(); 
    List<Employee> employeeList = new ArrayList<Employee>(limit); 
    while (queryIterator.hasNext()) { 
     employeeList.add(queryIterator.next()); 
    } 
    return CollectionResponse.<Employee>builder().setItems(employeeList).setNextPageToken(queryIterator.getCursor().toWebSafeString()).build(); 
} 

@ApiMethod(
    name = "jobList", 
    path = "employee/{id}/jobList", 
    httpMethod = ApiMethod.HttpMethod.GET) 
public CollectionResponse<Job> jobList(@Named("id") Long employeeId) { 
    int limit = DEFAULT_LIST_LIMIT; 
    Query<Job> query = OfyService.ofy().load().type(Job.class).limit(limit); 
    QueryResultIterator<Job> queryIterator = query.iterator(); 
    List<Job> jobList = new ArrayList<>(limit); 
    while (queryIterator.hasNext()) { 
     jobList.add(queryIterator.next()); 
    } 
    return CollectionResponse.<Job>builder().setItems(jobList).setNextPageToken(queryIterator.getCursor().toWebSafeString()).build(); 
} 

Я могу видеть работник на сервере с списка() методом и есть один Работа перечисленная внутри работник:

200 

{ 
    "items": [ 
    { 
    "id": "5732568548769792", 
    "name": "Sophie", 
    "jobList": [ 
     { 
     "title": "Haircut", 
     "duration": 30, 
     "price": 300 
     } 
    ], 
... 
} 

Но когда я пытаюсь получить эту работу с помощью JobList() метода с ID = 5732568548769792 это ничего не возвращает:

200 

{ 
"kind": "employeeApi#resourcesItem", 
"etag": "\"eEm63BNCBzxEAy3aqxetQdspGKA/FzFIL_vxOIIBu5chWZYooI-ArvQ\"" 
} 

Если я указываю предка с

Query<Job> query = OfyService.ofy().load().type(Job.class).ancestor(Key.create(Employee.class, employeeId)).limit(limit); 

в jobList() результат не изменяется.

Что я должен изменить в коде выше, чтобы получить желаемый список заданий?

ответ

0

В соответствии с вашей моделью сущности нет связи между Employee и объектом Job.So не может выполнять запрос предка в объекте Job, поскольку у него нет какого-либо предка (родителя).

Кроме того, сущность субъекта имеет атрибут joblist. это означает, что вы можете получить список работы сотрудника после получения этого сотрудника, используя employee.getjobList() метод getterListList в Employee Entity.

Лучше всего изменить модель сущности и создать связь между Employee и Job, а затем получить сущности с помощью безопасного веб-ключа, например.

Изменение:

@Entity 
public class Employee { 
    @Id 
    private Long id; 
    private String name; 
    private List<Job> jobList = new ArrayList<>(); 
    private Week week; 

    public Employee() { 
    } 

    //Getters and setters for all fields. 
} 

@Entity 
public class Job { 
    @Id 
    private Long id; 
    private String title; 
    private int duration; 
    private int price; 

    public Job() { 
    } 
    //Getters and setters for all fields. 
} 

To:

@Entity 
public class Employee { 
    @Id 
    private Long id; 
    private String name; 

    private Week week; 

    public Employee() { 
    } 
public String getWebsafeKey() { 
     return Key.create(Employee.class, id).getString(); 
    } 
    //Getters and setters for all fields. 
} 

@Entity 
public class Job { 
    @Id 
    private Long id; 
    private String title; 
    private int duration; 
    private int price; 
@Index 
    @ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
    Ref<Employee> employeeRef; 
    public Job() { 
    } 
public String getWebsafeKey() { 
     return Key.create(employeeRef.getKey(), Job.class, id).getString(); 
    } 
    //Getters and setters for all fields. 
} 

эта модель вернет вам ключ websafe сущности создаваемого в ответ. используйте это websafe, когда вы хотите получить доступ к созданному объекту. при создании задания, создать отношения задания должны быть созданы с Работником, который уже созданный с помощью:

job.employeeRef = Ref.create(employeeKey); 

После этого измените Апи метод:

@ApiMethod(
    name = "jobList", 
    path = "employee/{id}/jobList", 
    httpMethod = ApiMethod.HttpMethod.GET) 
public CollectionResponse<Job> jobList(@Named("id") Long employeeId) { 
    int limit = DEFAULT_LIST_LIMIT; 
    Query<Job> query = OfyService.ofy().load().type(Job.class).limit(limit); 
    QueryResultIterator<Job> queryIterator = query.iterator(); 
    List<Job> jobList = new ArrayList<>(limit); 
    while (queryIterator.hasNext()) { 
     jobList.add(queryIterator.next()); 
    } 
    return CollectionResponse.<Job>builder().setItems(jobList).setNextPageToken(queryIterator.getCursor().toWebSafeString()).build(); 
} 

To:

@ApiMethod(
    name = "jobList", 
    path = "employee/{employee_web_safe_key}/jobList", 
    httpMethod = ApiMethod.HttpMethod.GET) 
public CollectionResponse<Job> jobList(@Named("employee_web_safe_key") String employeeWSKey) { 
    int limit = DEFAULT_LIST_LIMIT; 
    Query<Job> query = OfyService.ofy().load().type(Job.class).limit(limit); 
query=query.filter("employeeRef =",Key.create(employeeWSKey)) 
    QueryResultIterator<Job> queryIterator = query.iterator(); 
    List<Job> jobList = new ArrayList<>(limit); 
    while (queryIterator.hasNext()) { 
     jobList.add(queryIterator.next()); 
    } 
    return CollectionResponse.<Job>builder().setItems(jobList).setNextPageToken(queryIterator.getCursor().toWebSafeString()).build(); 
} 

Это даст вам все работы, связанные с данным сотрудником.

Вы также можете выполнить запрос предка, если вы создаете свою модель, добавив индекс @Parent в Ref employeeRef; , например.

@Parent 
@Index 
@ApiResourceProperty(ignored = AnnotationBoolean.TRUE) 
Ref<Employee> employeeRef; 
+0

Спасибо, Baqir. К сожалению, у меня нет времени прямо сейчас, чтобы проверить ваш ответ, но я обязательно сделаю это. – isabsent

+0

его хорошо, я могу понять. Во время проверки, если вы найдете ответ полезным, просто поднимите меня. :) – Baqir

Смежные вопросы