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>();

...

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top