2014-09-17 15 views
5

Tôi đang cố gắng mở rộng chương trình cơ sở dữ liệu của mình bằng một hàm để thực hiện bất kỳ truy vấn hql nào. Tôi gần như hoàn thành nó nhưng tôi gặp lỗi trong quá trình sau.Hibernate dường như tạo sai truy vấn SQL từ truy vấn HQL

select p.reviews, p.title from Product p 

truy vấn HQL này được chuyển đổi trong một truy vấn sql như sau:

Hibernate: select . as col_0_0_, product0_.title as col_1_0_, reviews1_.account_number as account_1_2_, reviews1_.product_id as product_2_2_, reviews1_.points as points3_2_, reviews1_.review as review4_2_ from dbprak12.view_product_meta product0_ inner join dbprak12.view_customer_evaluates reviews1_ on product0_.product_id=reviews1_.product_id 

Như bạn rõ ràng có thể thấy, có sẽ được ném một lỗi với mã trạng thái sql 42601. Bởi vì "như col_0_0_.. .. "không đúng cú pháp. Nhưng tôi không hiểu tại sao hibernate tạo truy vấn sql này.

tôi sử dụng hai ánh xạ xml sau:

Product.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 

<class name="media.definitions.Product" table="dbprak12.view_product_meta"> 
    <id name="asin" column="product_id"> 
    <generator class="native" /> 
    </id> 
    <property name="title" column="title" /> 
    <property name="avgRating" column="rating" /> 
    <property name="salesRank" column="sales_rank" /> 
    <property name="picUrl" column="picture" /> 
    <set name="reviews" cascade="all" inverse="true" lazy="true"> 
     <key column="product_id" /> 
     <one-to-many class="media.definitions.Review" /> 
    </set> 
    <set name="categories" table="dbprak12.view_product_in_category" inverse="false" lazy="true" fetch="select" cascade="all"> 
    <key column="product_id" /> 
    <many-to-many column="category_id" class="media.definitions.Category" /> 
    </set> 
    <joined-subclass name="media.definitions.Book" table="dbprak12.view_book"> 
    <key column="product_id" /> 
    <property name="isbn" column="isbn" /> 
    <property name="publishers" column="publisher" /> 
    <property name="pubDate" column="publication" /> 
    <property name="pages" column="pages" /> 
    </joined-subclass> 
    <joined-subclass name="media.definitions.DVD" table="dbprak12.view_dvd"> 
    <key column="product_id" /> 
    <property name="format" column="fformat" /> 
    <property name="regionCode" column="region_code" /> 
    <property name="runningTime" column="running_time" /> 
    </joined-subclass> 
    <joined-subclass name="media.definitions.Music" table="dbprak12.view_cd"> 
    <key column="product_id" /> 
    <property name="labels" column="label" /> 
    <property name="releaseDate" column="release_date" /> 
    </joined-subclass> 
</class> 

</hibernate-mapping> 

Review.hbm.xml

<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 

<hibernate-mapping> 

<class name="media.definitions.Review" table="dbprak12.view_customer_evaluates"> 
<composite-id> 
    <key-property name="accountNumber" column="account_number" /> 
    <key-many-to-one name="product" class="media.definitions.Product" lazy="false"> 
     <column name="product_id"></column> 
    </key-many-to-one> 
</composite-id> 
<property name="rating" column="points" /> 
<property name="content" column="review" /> 
</class> 

</hibernate-mapping> 

Chỉnh sửa: tập tin cấu hình Hibernate của tôi: hibernate. cfg.xml

<!DOCTYPE hibernate-configuration PUBLIC 
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN" 
    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 

    <session-factory> 
     <property name="hibernate.connection.pool_size">10</property> 
     <property name="show_sql">true</property> 
     <property name="hibernate.current_session_context_class">thread</property> 

     <mapping resource="Product.hbm.xml"/> 
     <mapping resource="Category.hbm.xml"/> 
     <mapping resource="Review.hbm.xml"/> 
     <mapping resource="Person.hbm.xml"/> 
     <mapping resource="Offer.hbm.xml"/> 

    </session-factory> 
</hibernate-configuration> 

db2Module.properties

# 
# Database module to load 
# 
middleware.module:media.mediadbimpl.DB2Module 

# 
# Database properties 
# 

db.jdbc.dialect:org.hibernate.dialect.DB2Dialect 
db.jdbc.driver:com.ibm.db2.jcc.DB2Driver 
db.jdbc.url:jdbc:db2://anyurl.de:50001/datasource 
db.user:dbuser 
db.password:.dbpass. 
+0

Hãy đăng tập tin 'hibernate.cfg.xml' của bạn, vui lòng? – hd1

+0

Đã chỉnh sửa bài đăng của tôi :) Có thêm một tệp thuộc tính nữa, chỉ đặt dữ liệu kết nối và phương ngữ (DB2) –

+0

Thử khai báo phương ngữ bạn đang sử dụng explictly – hd1

Trả lời

0

Chú ý: đây không phải là một câu trả lời nghiên cứu, vì vậy nó có thể không đúng.

Tôi nghĩ lỗi của bạn có thể có mặt ở đây:

<column name="product_id"></column> 

Tôi nghĩ rằng điều này nên được

<column name="product_id" /> 

Có nội dung cơ thể (thậm chí 0 ký tự) trong một thẻ khác với không có nội dung cơ thể. (so sánh với "" và null cho string)

tài liệu nói rằng bạn có thể sử dụng các yếu tố cột lồng bên trong chính

<key-many-to-one name="product" class="media.definitions.Product" lazy="false"> 
    <column name="product_id" /> 
</key-many-to-one> 

nhưng có vẻ bạn không sử dụng nó, vì vậy bạn chỉ có thể làm:

<key-many-to-one name="product" class="media.definitions.Product" lazy="false" column="product_id" /> 

thẻ phụ thường được sử dụng cho các cột không chuẩn.

anyways cung cấp cho nó một shot

+0

Các yếu tố là tốt. Đó không phải là một vấn đề. OP không cho biết phiên bản Hibernate đang được sử dụng, nhưng tôi biết rằng có các phiên bản cũ hơn có vấn đề với truy vấn vô hướng cũng lấy các bộ sưu tập chính xác * những gì anh ta làm ở đây với "SELECT p.reviews, p .title "... p.reviews là một bộ sưu tập và p.title là một vô hướng. –

+0

@JoshuaDavis có thể là giá trị xây dựng trong một câu trả lời sau đó :) – Joeblade

+0

Tôi sẽ nếu tôi có thể hiểu được mục tiêu của truy vấn. Đó là một điều kỳ lạ để làm để có được một bộ sưu tập và một vô hướng. Cũng có thể chỉ nhận được các thực thể và điều hướng đồ thị đối tượng để có được những gì bạn muốn. Mặc dù tôi đồng ý rằng XML ánh xạ của bạn tốt hơn/sạch hơn, các ánh xạ trong câu hỏi sẽ hoạt động giống nhau. –

Các vấn đề liên quan