Запросы Hibernate - проблема с разрешением свойства - PullRequest
0 голосов
/ 08 октября 2011

Эй, у меня небольшая проблема при выполнении запроса: строка запроса: Query query = session.createQuery ("из рецепта r, где r.name = '" + searchString + "' и r.ownerid =" + userId);

Файл .hbm.xml:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated Aug 26, 2011 10:56:44 AM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
 <class catalog="icdb" name="com.icdb.data.Recipe" table="recipes">
  <id name="recipeid" type="int">
   <column name="recipeid"/>
   <generator class="identity"/>
  </id>
  <many-to-one class="com.icdb.data.User" fetch="select" name="users">
   <column name="ownerid" not-null="true"/>
  </many-to-one>
  <property generated="never" lazy="false" name="releasedate" type="timestamp">
   <column length="19" name="releasedate" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="preparationtime" type="int">
   <column name="preparationtime" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="name" type="string">
   <column length="50" name="name" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="description" type="string">
   <column length="200" name="description"/>
  </property>
  <property generated="never" lazy="false" name="lastupdated" type="timestamp">
   <column length="19" name="lastupdated" not-null="true"/>
  </property>
  <property generated="never" lazy="false" name="servecount" type="java.lang.Integer">
   <column name="servecount"/>
  </property>
  <property generated="never" lazy="false" name="complete" type="boolean">
   <column name="complete" not-null="true"/>
  </property>
  <set fetch="select" inverse="true" lazy="true" name="recipepictureses"
   sort="unsorted" table="recipepictures">
   <key>
    <column name="recipeid" not-null="true"/>
   </key>
   <one-to-many class="com.icdb.data.RecipePicture"/>
  </set>
  <set fetch="select" inverse="true" lazy="true"
   name="recipeingredientses" sort="unsorted" table="recipeingredients">
   <key>
    <column name="recipeid" not-null="true"/>
   </key>
   <one-to-many class="com.icdb.data.RecipeIngredient"/>
  </set>
  <set fetch="select" inverse="true" lazy="true" name="recipetipses"
   sort="unsorted" table="recipetips">
   <key>
    <column name="recipeid" not-null="true"/>
   </key>
   <one-to-many class="com.icdb.data.RecipeTip"/>
  </set>
  <set fetch="select" inverse="true" lazy="true" name="recipereviewses"
   sort="unsorted" table="recipereviews">
   <key>
    <column name="recipeid" not-null="true"/>
   </key>
   <one-to-many class="com.icdb.data.RecipeReview"/>
  </set>
  <set fetch="select" inverse="true" lazy="true"
   name="recipeinstructionses" sort="unsorted" table="recipeinstructions">
   <key>
    <column name="recipeid" not-null="true"/>
   </key>
   <one-to-many class="com.icdb.data.RecipeInstruction"/>
  </set>
  <property name="recipedifficulty" type="int">
   <column name="recipedifficulty" not-null="true" sql-type="INTEGER"/>
  </property>
 </class>
</hibernate-mapping>

Я получаю исключение: «Не удалось разрешить идентификатор владельца Recipe ...»

Почему?Что я объявил неправильно?Или я делаю запрос неправильно?

Yoav

1 Ответ

2 голосов
/ 08 октября 2011

вам либо нужно:

1) добавить свойство ownerid к отображению

<property name="ownerid" type="int">
   <column name="ownerid" not-null="true"/>
</property>

OR

2) используйте r.users.id в своем запросе (при условии, что свойство первичного ключа пользователя - 'id') *

Query query = session.createQuery("from Recipe r where r.name='" + searchString + "' and r.users.id=" + userId );

примечание 1: лучше использовать позиционные или именованные параметры в запросе вместо конкатенации строк - http://www.mkyong.com/hibernate/hibernate-parameter-binding-examples/

примечание 2: до тех пор, пока сопоставление ассоциаций «пользователи» имеет отношение «многие к одному», более подходящее имя для него - «пользователь» - с каждым рецептом связан только один пользователь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...