2013-12-13 3 views
0

Как запустить запрос соединения HQL в Hibernate? Я вставил значения в таблицы отношений один к одному. Но прежде чем я вставляю в таблицы, мне нужно проверить, существует ли это значение. Если exit i нужен id для этой записи. После этого я вставляю в таблицу orderdetails.Как выполнить запрос соединения в спящем режиме?

Итак, мне нужно запустить SQL, чтобы получить идентификатор из таблицы.

Таблица: Продукт

Product_id 
product_name 

Таблица: версия

version_id 
product_id 
date 

Поэтому мне нужно найти version_id если запись существует. Я хотел бы запустить SQL: select version_id from product p,version v where p.product_id=v.product_id and product_name='stackoverflow'

Я пробовал этот способ ..

Query q=session.createQuery("from Product p,Version v where p.product_id=v.product_id and productname='"+item+"'"); 
if(query.list().size()>0){ 
for(Iterator it=query.iterate();it.hasNext();) 
{ 
Version std = (Version) it.next(); 
System.out.println("partid: " + std.getversion_id()); 
V.setversion_id(std.getversion_id()); 
} 

Но выше код дает ошибку.

org.hibernate.QueryException: could not resolve property: product_id of: Version [from Product p,Version v where p.product_id=v.product_id and productname='stack'] 
    at org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81) 
    at org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75) 
    at org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1465) 
    at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:315) 
    at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487) 
    at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611) 
    at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263) 
    at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210) 
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117) 
    at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113) 
    at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:880) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1330) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4471) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:3947) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:2047) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1972) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:831) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:617) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:301) 
    at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:244) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:256) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:187) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:138) 
    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 com.import(CompleteNotice.java:764) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) 
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:606) 
    at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
    at java.lang.Thread.run(Thread.java:619) 

Класс продукта:

@Entity 
@Table(name="DBO.PRODUCT") 
public class Product{ 

    private String product_id; 
    private String product_name 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="PRODUT_ID") 
    public String getProduct_id() { 
     return product_id; 
    } 

    public void setProduct_id(String product_id) { 
     this.product_id = product_id; 
    } 

    @Column(name="PRODUCT_NAME") 
    public String getProduct_name() { 
     return product_name; 
    } 

    public void setProduct_name(String product_name) { 
     this.product_name = product_name; 
    } 


} 

Версия:

@Entity 
@Table(name="DBO.VERSION") 
public class Version { 

    private int version_id; 
    private int product_id; 
    private Product product; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name="VERSION_ID") 
    public int getVersion_id() { 
     return version_id; 
    } 

    public void setVersion_id(int Version_id) { 
     this.version_id = version_id; 
    } 


    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="product_id") 
    public Product getProduct() { 
     return product; 
    } 

    public void setProduct(Product product) { 
     this.product = product; 
    } 

Пожалуйста, посоветуйте, как выполнить выше запрос в спящий режим?

+0

В вашем столе у ​​продукта могут быть версии «один-ко-многим» – nachokk

+0

, во-первых, существует недостающее qhitespace между продуктом и p. – Diversity

+0

Наши продукты бизнес-версии отличаются. У нас есть еще несколько таблиц, чтобы иметь таблицы отношений один-ко-многим для версии. Применяйте только один-к-одному – user2848031

ответ

0

Сначала ваше имя класса в этом случае является частью, а не продуктом. Таким образом, вы должны использовать также Part в своем запросе.

Во-вторых, я не уверен, есть ли генератор идентификаторов спящего режима, который способен генерировать последовательности строк , поэтому вам нужно назначить настроенный генератор идентификаторов.

Кроме того, код, который вы опубликовали, не показывает класс версии, и это соединение с Продуктом или его частью.

На мой взгляд, и, несмотря на проблемы ид ваш запрос должен выглядеть следующим образом

select v.version_id 
from FeatureVersion v, Part p 
where v.product.product_id = p.product_id 
and p.product_name='"+item+" 

При выполнении этого запроса. Hibernate создает instamce типа FeaturedVersion и инициализирует его свойства в соответствии с соответствующими столбцами таблицы.

Старайтесь избегать использования таких заявлений. Используйте PreparedStatements вместо этого, чтобы передать параметры в запрос и использовать именованные параметры или так, чтобы назначить их запросу.

Попробуйте использовать имена свойств и классов, соответствующие требованиям Java и JavaBeans, и Средство избегает недочета и т. Д. Таким образом, его проще прочитать запрос, и вы избегаете разочарования в поиске ошибок.

+0

Генератор SQL генерирует идентификатор для обеих таблиц. Потому что вставка записей отлично. Теперь я хочу проверить, существует ли конкретный элемент alredy или не только. – user2848031

+0

Хорошо, я этого не знал. Но хорошо знать. – Diversity

+0

Assum Продукт и версия в виде таблиц. Таким образом, запрос будет выбран v.version_id из Product p, Version v, где v.product_id = p.product_id и name = 'item'. – user2848031

0

Ваше картирование плохо. Вам не нужно product_id в FeatureVersion

@Entity 
@Table(name="DBO.PRODUCT") 
public class Part { // why not call Product.. 

    private String product_id; 
    private String product_name; 
    private FeatureVersion version;  

    @OneToOne(mappedBy="product") 
    public FeatureVersion getFeatureVersion(){ 
     return featureVersion; 
    }  
     //put others getters and setter 
} 

И в другом классе.

@Entity 
@Table(name="DBO.VERSION") 
public class FeatureVersion { 

    private int version_id; 
    private Product product; 

    //add setter and getter that i leave 

    @OneToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name="product_id", referencedColumnName= "product_id") 
    public Product getProduct() { 
     return product; 
    } 

} 

И код клиента строка запроса выглядит следующим образом:

String hql = "FROM Part p fetch join p.version Where p.product_name = :myParam" // this is cause you put it lazy if you don't put anything it will be eager 
session.createQuery(hql).setParameter("myParam", productName).uniqueResult() // or list 

Некоторые советы:

1) Следуйте ява код конвенции например изменения product_name к productName или просто name. 2) Вызовите классы с тем же именем в базе данных, что и соглашение.

3) Для строк я бы использовал like, а не =, если вы не хотите точного соответствия.

Смежные вопросы