Как ограничить 1 элемент в запросе левого соединения с JPA? - PullRequest
2 голосов
/ 24 января 2012

Вот мой пример использования:

public class User extends Model {}

public class TableA extends Model {
    @OneToMany
    public List<TableB> tableBs;

    @ManyToOne
    public AnObject anObject;
}

public class TableB extends Model {
    @ManyToOne
    public TableA tableA;

    @ManyToOne
    public User user;

    public String status;
}

Пользователь получает список записей TableA на основе экземпляра AnObject. Я хотел бы показать этому пользователю, является ли TableA новым или нет.

(обратите внимание, что TableB действует как таблица n: n для пользователя и TableA, я не могу интегрировать ее в TableA)

Чтобы сказать, является ли это новым, это зависит от TableB. Для этого у меня есть два варианта:

  • Либо создаю TableB, когда я создаю TableA, но со статусом NEW или Нет
  • Или не создавать TableB для этого пользователя. Если для этого пользователя отсутствует ссылка, значит, она новая. (делая это, я мог бы удалить статус столбца)

(действия зависят от «нового», это не просто ярлык для отображения).

Теперь, в моем запросе JPA, как я могу указать, является ли для этого члена запись в TableA новой или нет?

Простым способом было бы получить список TableA, а затем пройти по списку, чтобы проверить, есть ли в нем пользователь (метод, такой как isUserInTableB(User user))

Но возможно ли это сделать с помощью JPA, например, имея только один элемент в списке, который будет пользователем или пустым, если этот пользователь не связан?

(Надеюсь, мне ясно, это не так уж много в моей голове: /)

Большое спасибо за помощь, я ценю!

1 Ответ

1 голос
/ 25 января 2012

Список tableBs является атрибутом, а не результатом запроса, поэтому вы не можете загрузить его частично.

То, что вы можете сделать с одним запросом, - это извлечь экземпляр tableB на основе экземпляра tableA и пользователя.пример.Что-то вроде

public static TableB findByTableAAndUser(TableA, tableA, User user) {
    return find("select tableB from TableB tableB where tableB.tableA=? and tableB.user=?", tableA, user).first();
}

Другой способ, если вы хотите использовать метод isNew для экземпляра tableA, это извлечь коллекцию tableBs при загрузке tableA и выполнить итерацию по экземплярам tableBs в методе isNew.Что-то вроде

public boolean isNew(User user) {
    for (TableB tableB : tableBs) {
        if (tableB.user.equals(user)) {
            return true;
        }
    }
    return false;
}

ваш метод findByIdWithTableBs может быть

public static TableA findByIdWithTableBs(Long id) {
    return find("select tableA from TableA tableA fetch join tableA.tableBs where tableA.id=?", id).first();
}
...