Supprimer des éléments à l'aide HQL clause « supprimer d'où est vide »
-
28-10-2019 - |
Question
J'ai deux entités dans une relation
tag <-m:n-> software
et je veux supprimer tous les logiciels qui ne sont pas des liens vers des balises plus après la suppression de balise particulière. Je vous écris la requête HQL pour cela ..
i utilise play framework
mon surchargée 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;
}
mon test:
@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!!!
}
maintenant j'ai le problème qu'il supprime tous les logiciels, même si elles ont des liens avec étiquette.
mais je reçois SQL qui est formé à partir HQL il est comme:
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))
et il est bon SQL (je l'ai vérifié), mais pourquoi tout cela ne fonctionne pas comme HQL dans mon contexte ...?
mon test dit:
non, attendu: <1>, mais était: <0>
le code pour deux classes sont:
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>();
...
La solution
Il y a multiples façons:
`softwares.size = 0
taille(des logiciels) = 0 `
vous pouvez lire pour en savoir plus sur eux:
http: // docs. jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html#queryhql-expressions