Целевые запросы Java для Java

Jit Ren спросил: 28 апреля 2018 в 08:33 в: java

Вот пример родителей с дочерними элементами

Parent[0].Children[0].Name = Johnson
Parent[0].Children[0].Age = 16Parent[0].Children[1].Name = Jessica
Parent[0].Children[1].Age = 17Parent[1].Children[0].Name = Lawson
Parent[1].Children[0].Age = 17Parent[1].Children[1].Name = Jessica
Parent[1].Children[1].Age = 19

Я просто хотел получить родителя с дочерним именем Jessica & возраст 17

Когда я попробовал

realm.where(Parent.class).beginGroup().equalTo("childrens.name","Jessica").equalTo("childrens.age","17").endGroup().findAll();

, он вернул мне обоих родителей, поскольку у 2-го родителя были дети в возрасте 17 лет и старше; по имени Джессика. Как я могу получить только 1-го родителя?

2 ответа

EpicPandaForce ответил: 28 апреля 2018 в 09:00

Ссылка на запрос означает, что "имеет хотя бы один из X, где условие истинно"

Итак, ваш запрос

realm.where(Parent.class)  
     .beginGroup()
     .equalTo("childrens.name","Jessica")
     .equalTo("childrens.age","17")
     .endGroup()
     .findAll();

говорит

"дайте мне родителей, где у родителей есть хотя бы один из детей, где имя Джессика, И имеет хотя бы одного из детей, возраст которого равен 17"

Что такое родительский 1 и родительский 2, потому что они оба имеют ребенок по имени Джессика, и у них обоих есть ребенок в возрасте 17 лет.


Вы можете сделать две вещи:

1.)

realm.where(Parent.class)  
     .equalTo("childrens.name","Jessica")
     .findAll()
     .where()
     .equalTo("childrens.age","17")
     .findAll();

2.) В "Дети" определите @LinkingObjects

public class Child extends RealmObject {
    @LinkingObjects("children")
    private final RealmResults<Parent> parents = null;
}

Теперь вы можете сделать чек на основе детей:

RealmResults<Child> children = realm.where(Child.class).equalTo("name", "Jessica").equalTo("age", 17).findAll();
Child child = children.get(0);
RealmResults<Parent> parents = child.getParents(); // <-- parents of "Jessica, 17"
Jit Ren ответил: 28 апреля 2018 в 09:12
к сожалению, первое решение не будет работать в моем случае. 1-й findAll возвращает обоих родителей, поскольку у обоих есть ребенок Джессика, затем второй findAll также вернет обоих родителей, поскольку у обоих из них есть возраст ребенка 17. Я попробую @LinkingObjects.
Есть решение
Jit Ren ответил: 28 апреля 2018 в 03:05

Решается с помощью хакерского способа.

Создайте уникальный ключ для дочернего элемента, например

Parent[0].Children[0].UniqueKey = name + "_" + age

, и запросите уникальный ключ.