Как удалить записи в отношениях гибернации один ко многим

#hibernate #hql #hibernate-mapping

#гибернация #hql #гибернация-сопоставление

Вопрос:

У меня есть две таблицы, одна из которых — QuickLinks, а другая — OrgUnit. Таблица OrgUnit является родительской, а таблица QuickLinks — дочерней. Я добавил отношения в таблицу QuickLinks как многие к одному.

 @Entity
@Table(name ="TBL_STD_QUICK_LINKS")
public class QuickLinks {
    @Id
    @GeneratedValue
    @Column(name = "FLD_QUICK_LINK_ID")
    private Long quickLinkId;

    @Column(name = "FLD_DISPLAY_NAME")
    private String displayName;

    @ManyToOne
    private OrgUnit orgUnit; 
}



@Entity
@Table(name = "TBL_STD_ORG_UNIT")
public class OrgUnit implements Serializable  {
@Id
@GeneratedValue
@Column(name = "FLD_ORGUNIT_ID")
private Long orgUnitId;

@Column(name = "FLD_OUNAME")
private String ouName;

@Column(name = "FLD_OUPARENT_ID")
private Long ouParentId;

@Column(name = "FLD_OUPATH")
private String ouPath;

}
  

Я хочу удалить таблицу быстрых ссылок записей, чей FLD_OUPATH из OrgUnit начинается с ‘/ abc / xyz’.

 Query executeQuery = getSession().createQuery("delete from QuickLinks as links where links.orgUnit.ouPath like :OrgName");
 executeQuery.setParameter("OrgName", ouPath "%");
 executeQuery.executeUpdate();
  

но я получаю исключения при выполнении этого запроса.
Итак, кто-нибудь может сказать мне, что в этом не так.?

Комментарии:

1. Какие исключения? Опубликуйте трассировку стека.

Ответ №1:

Цитата из документации:

В массовом запросе HQL не могут быть указаны никакие формы синтаксиса соединения, ни неявные, ни явные. Подзапросы могут использоваться в предложении where, где сами подзапросы могут содержать объединения.

 links.orgUnit
  

является неявным внутренним соединением и, следовательно, неприемлемо.

Вы могли бы использовать собственный запрос (SQL). Или, как подсказывает документация, вы могли бы использовать подзапрос:

 delete from QuickLinks as link where link.id in 
    (select link2.id from QuickLinks link2 
     where link2.orgUnit.ouPath like :orgName)
  

Примечание сбоку: QuickLinks должно быть имя QuickLink .