Удалить элементы, используя предложение HQL «Удалить, где пусто».

StackOverflow https://stackoverflow.com/questions/5379902

Вопрос

У меня есть два субъекта в отношениях

tag <-m:n-> software

И я хочу удалить все программные материалы, которые больше не являются ссылками на теги после удаления определенного тега. Я пишу для этого запрос HQL ..

Я использую PlayFrameWork

my overded tag.delete ()

@Override
public Tag delete() {

    Tag t = null;

    // t = super.delete();   // commented for now

    // it should delete ONLY that softwares which are not linked with tags (tags is empty)
    Query q = Tag.em().createQuery("delete from Software s where s.tags is empty ");
    q.executeUpdate();

    return t;
}

Мой тест:

@Test
public void testDelete() throws InterruptedException {

    Tag tag1 = new Tag("tag1").save();
    Tag tag2 = new Tag("tag2").save();

    Author author1 = new Author("name", "email").save();

    Software s1 = new Software("soft1", "description1", author1, tag1).save(); // this should be deleted when tag1 is deleting

    Software s2 = new Software("soft2", "description2", author1, tag1, tag2).save(); // this should be deleted, because it links to tag2

    // checks, just in case: 
    Software ss = Software.findById(s1.id);
    assertTrue(ss.isPersistent());
    assertTrue(!ss.tags.isEmpty());
    assertEquals(1, ss.tags.size());

    tag1.delete();

    // try to find the software
    assertEquals(1, Software.findAll().size()); // here it faults, it deletes all!!!
}    

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

Но я получаю SQL, который сформирован из HQL, это похоже на:

delete from Software where not (exists (select tag.id from Tag_Software ts, Tag tag where Software.id=ts.softwares_id and ts.tags_id=tag.id))

И это хороший SQL (я проверил его), но почему все это не работает как HQL в моем контексте ...?

Мой тест говорит:

Неудача, ожидается: <1> Но было: <0>

Код для двух классов:

public class Tag extends Model {

    @Column(nullable = false, unique = true)
    public String title;

    public Tag(String title) {
        this.title = title;
    }

    @ManyToMany
    public List<Software> softwares = new LinkedList<Software>();

....

@Entity
public class Software extends Model {

    public String title;
    public String description;

    @ManyToOne(optional = false)
    public Author author;

    @ManyToMany(mappedBy = "softwares")
    public List<Tag> tags = new LinkedList<Tag>();

...

Это было полезно?

Решение

Есть многолетние способы:

`softwares.size = 0

размер (Softwares) = 0 `

Вы можете прочитать это, чтобы узнать о них больше:

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-expressions

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top