2010-12-15 25 views
9

Ben Hibernate kullanıyorum ve bu sorguyu var. Ama şimdi, sadece bazı insanlar istiyorum.kipi: org.hibernate.hql.ast.QuerySyntaxException: Beklenmeyen belirteç

Benim veritabanı şeması:

Proje < - Project_Person -

Yani sadece bir projenin üyesi Kişiler istiyorum> Kişi. Ben istenen sonucu almak veritabanı üzerinde SQL deyimi ile

:

List<Person> list = 
    sess.createQuery(
     "from Person inner join Project_Person 
      on person_id = id 
      where project_id = "+projectId).list(); 

Ama burada bir hata alıyorum:

select * from Person inner join Project_Person 
    on person_id = id 
    where project_id = 1; 

Ben de düşündüm, ben hazırda ile bu yazabilirsiniz

SERVE: Servlet.service() for servlet myproject3 threw exception 
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: on near line 1, column 65 [from com.mydomain.myproject.domain.Person inner join Project_Person on person_id = id where project_id = 1] 
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:54) 
at org.hibernate.hql.ast.QuerySyntaxException.convert(QuerySyntaxException.java:47) 
at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:82) 
at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:284) 
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:182) 
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:124) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1770) 
at sun.reflect.GeneratedMethodAccessor33.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:344) 
at $Proxy26.createQuery(Unknown Source) 
... 

Burada neyin yanlış olduğu hakkında bir fikri olan var mı?

Saygılarımızla.

Yeni Hata:

SERVE: Servlet.service() for servlet myproject3 threw exception 
org.hibernate.QueryException: could not resolve property: project of: com.mydomain.myproject.domain.Person [from com.mydomain.myproject.domain.Person p where p.project.id = :id] 

n: m ilişkisi:

@ManyToMany(cascade = CascadeType.ALL) 
@JoinTable(name = "Project_Person", 
    joinColumns = {@JoinColumn(name="project_id", referencedColumnName="id")}, 
    inverseJoinColumns = {@JoinColumn(name="person_id", referencedColumnName="id")} 
) 
private Set<Person> persons = new HashSet<Person>(); 


@ManyToMany(mappedBy="persons") 
private Set<Project> projects = new HashSet<Project>(); 

Tam Hata

Hibernate: select project0_.id as id1_, project0_.createDate as create2_1_, project0_.description as descript3_1_, project0_.name as name1_ from Project project0_ where project0_.id=1 
Hibernate: select person0_.id as id0_0_, project2_.id as id1_1_, person0_.email as email0_0_, person0_.firstName as firstName0_0_, person0_.lastName as lastName0_0_, project2_.createDate as create2_1_1_, project2_.description as descript3_1_1_, project2_.name as name1_1_ from Person person0_ inner join Project_Person projects1_ on person0_.id=projects1_.person_id inner join Project project2_ on projects1_.project_id=project2_.id where project2_.id=? 
15.12.2010 16:42:26 org.apache.catalina.core.ApplicationDispatcher invoke 
SERVE: Servlet.service() for servlet myproject3 threw exception 
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to com.mydomain.myproject.domain.Person 

cevap

24

HQL sorguları değil veritabanına karşı, nesne modeli karşı yazılır şema. Bu nedenle, sorgunuz kişi ve projeler arasındaki ilişkiyi nasıl eşlediğinize bağlıdır. Örneğin, Person içinde project özellik aracılığıyla Project bir sayıda bire bir ilişkisi vardır, sorgu aşağıdaki gibi görünecektir:

List<Person> list = sess.createQuery(
    "from Person p where p.project.id = :id") 
    .setParameter("id", projectId) 
    .list(); 

DÜZENLEME: çok-çok ilişkinin durumda

gerek
select p from Person p join p.projects proj where proj.id = :id 

Ayrıca dize birleştirme yoluyla bu geçen parametreler yerine setParameter() kullanmak kötü bir uygulamadır.

+0

Hmm, ancak çalışmıyor. Sorumu yeni hatayla güncelledim, anladım. Çoktan çoğa ilişkisi var, yabancı anahtarlar project_id ve person_id – Tim

+0

Artık hiçbir Hazırda Bekleme hatası yok, ancak bir tane daha: SERVE: Servlet MyService() servlet myproject3'ü istisna attı java.lang.ClassCastException: [Ljava .lang.Object; com.mydomain.myproject.domain.Person – Tim

+0

'a gönderilemedi. Sorumu tam hata ve Hazırda Bulunan SQL deyimleriyle güncelleştirdim. Aynı zamanda proje değerlerini okuyor ve Kişiye yerleştirmek mi istiyor? Bu hatanın sebebi mi? – Tim

İlgili konular