[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-3168) 3.2.6 breaks querying by a property of an entity in a collection

Michael Newcomb (JIRA) noreply at atlassian.com
Thu Mar 6 15:35:33 EST 2008


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-3168?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_29714 ] 

Michael Newcomb commented on HHH-3168:
--------------------------------------

In 3.2.5, everything works as expected... In 3.2.6, it fails to initialize the entity...

Here is an example that demonstrates this bug:

import java.util.Set;
import java.util.HashSet;
import java.util.List;

import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Entity;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Query;

@Entity
@NamedQueries(value = {
@NamedQuery(
  name = "Cat.by.kitten.name",
  query = "select c from Cat c inner join c.kittens as kitten with kitten.name=:name"),
@NamedQuery(
  name = "Cat.by.kitten.name2",
  query = "select c from Cat c where c.kittens.name=:name")
  }
)
public class Cat
{
  @Id
  protected String name;

  @OneToMany
  protected Set<Cat> kittens = new HashSet<Cat>();

  public Cat(String name)
  {
    this.name = name;
  }

  public Set<Cat> getKittens()
  {
    return kittens;
  }

  public static void main(String... args)
  {
    EntityManager entityManager;

    entityManager.getTransaction().begin();

    Cat mom = new Cat("mom1");
    Cat kitten1 = new Cat("mom1.kitten1");
    Cat kitten2 = new Cat("mom1.kitten2");

    entityManager.persist(mom);
    entityManager.persist(kitten1);
    entityManager.persist(kitten2);

    mom.getKittens().add(kitten1);
    mom.getKittens().add(kitten2);

    mom = new Cat("mom2");
    kitten1 = new Cat("mom2.kitten1");
    kitten2 = new Cat("mom2.kitten2");

    entityManager.persist(mom);
    entityManager.persist(kitten1);
    entityManager.persist(kitten2);

    mom.getKittens().add(kitten1);
    mom.getKittens().add(kitten2);

    entityManager.getTransaction().commit();

    Query query = entityManager.createNamedQuery("Cat.by.kitten.name");
    query.setParameter("name", "mom1.kitten1");
    for (Cat cat : (List<Cat>) query.getResultList())
    {
      System.out.println(cat.name);
    }

    query = entityManager.createNamedQuery("Cat.by.kitten.name2");
    query.setParameter("name", "mom1.kitten1");
    for (Cat cat : (List<Cat>) query.getResultList())
    {
      System.out.println(cat.name);
    }
  }
}


> 3.2.6 breaks querying by a property of an entity in a collection
> ----------------------------------------------------------------
>
>                 Key: HHH-3168
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-3168
>             Project: Hibernate3
>          Issue Type: Bug
>    Affects Versions: 3.2.6
>            Reporter: Michael Newcomb
>            Assignee: Gail Badner
>
> @NamedQuery(name="q", query="select a from A a where a.stuff.name=:name")
> class A
> {
>   @ManyToMany
>   @MapKey(name = "name")
>   @Sort(type = SortType.NATURAL)
>   SortedMap<String, C> stuff;
> }
> class B
> {
>   @Basic
>   String name;
> }
> class C
>   extends B
> {
> }
> Please excuse the brevity of the example (code is not on internet accessible machine), but just dropping in 3.2.6 hibernate3.jar causes an error in DotNode.propertyType is set to the type of 'name' and fails all the checks in resolve() and calls checkLhsIsNotCollection() which fails...
> When looking at the logs...
> 3.2.5:
> [DotNode] dereferenceCollection(): Created...
> [FromReferenceNode] Resolved :  a.stuff -> .
> [DotNode] getDataType() : name -> ...StringType
> [FromReferenceNode] Resolved :  a.stuff.name -> xxx.name
> [HqlSqlBaseWalker] select : finishing up...
> - at this point there is some logs about 'Using FROM fragment' and then it prints another AST tree with something about querySpaces...
> - then it starts to check the next query
> 3.2.6:
> [DotNode] dereferenceCollection(): Created...
> [FromReferenceNode] Resolved :  a.stuff -> .
> [DotNode] getDataType() : name -> ...StringType
> - then it starts to check the next query
> - it is missing all the extra stuff after the 'getDataType() : name -> ...StringType'

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        



More information about the hibernate-issues mailing list