2014-01-15 4 views
0

У меня есть несколько объектов, которые имеют переходные свойства, которые я хотел бы заполнить из SQL-запроса. Я пробовал несколько вещей, но пока не нашел правильной комбинации.Java Hibernate заполняет переходное свойство

вот пример сущность

@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
long id; 
@Size(max=1000) 
String image_url; 

@Transient 
boolean liked; 

@Transient 
long numLikes; 

**getters and setters** for persistent properties 

    public boolean isLiked() { 
    return liked; 
} 

public void setLiked(boolean liked) { 
    this.liked = liked; 
} 

public long getNumLikes() { 
    return numLikes; 
} 

public void setNumLikes(long numLikes) { 
    this.numLikes = numLikes; 
} 

Я попытался с помощью @Basic и установок этой заметки это принести метод нетерпеливого

@Basic(fetch = FetchType.EAGER) 

на добытчиках, но это, похоже, ничего не делать , Я видел, что он тоже ленив.

Я пропустил что-нибудь здесь, что приведет к тому, что имя столбца не будет сопоставлено с одним из этих свойств переходного процесса?

вот мой код.

SQLQuery query = getCurrentSession().createSQLQuery("" + 
      "SELECT * ,count(likes1.liked) as numLikes " + 
      "FROM aboutme " + 
      "left JOIN " + 
      "(" + 
      " select liked, likedObject_id " + 
      " from likes " + 
      " where liked = 1" + 
      ") as likes1 ON aboutme.id = likes1.likedObject_id " + 
      "left join " + 
      "(" + 
      " select likedObject_id, liked " + 
      " from likes " + 
      " where liked = 1 and profile_id = :id" + 
      ") as likes2 on likes2.likedObject_id = aboutme.id " + 
      "WHERE aboutme.profile_id = :id " + 
      "group by aboutme.id"); 

    query.addEntity(AboutMe.class); 
    query.setParameter("id",id); 

    return query.list(); 

Я попытался с помощью

SQLQuery query = ..."Select count(value that returns properly) as {object.numLikes}..." 


query.addEntity("object",Object.class), 

Я получаю ошибку здесь, что говорит он не может найти имя столбца для свойства [свойств] для псевдонима [псевдоним]

Что я делаю неправильно?

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

+1

Transient отмечен для полей/методов, которые никогда не должны принимать участие в сохранении базы данных. Они не настойчивы. Почему вам нужно, чтобы все эти поля были аннотированы так или иначе, в чем причина? – Vaelyr

+0

ОК, возможно, переходные свойства - это не тот маршрут, на который мне нужно идти. У меня есть отношения друг к другу. для подобной части. возможно, я должен вернуть два объекта в списке и запустить его таким образом? есть ли способ вернуть производное свойство, которое не является частью объекта таблицы? как вы это сделали/видели это? –

ответ

2

Hibernate никогда не заполнит ваши переходные поля, а наиболее важные переходные поля даже не являются частью процесса сериализации java. Я бы попытался, если вам это действительно нужно, - это ResultTransformer.alliasToBean, который «впрыскивает» значения в класс с отражением.

setResultTransformer(Transformers.aliasToBean(Yourclass.class)); 

Просто быстрая идея, не зная, будет ли она работать.

+0

Стоит также отметить, что если вы идете по этому маршруту, класс вообще не должен быть сущностью (что, возможно, класс ученика нет, поскольку на самом деле он не отображается на таблицу) –

+0

класс отображает таблицу. но я пытаюсь выяснить, как сделать таблицу с дополнительными производными полями сопоставлением с объектом, который я могу вернуть в интерфейс. –

1

Я понял. Вы можете установить свойство переходного процесса, хотя это своего рода боль.

с помощью метода addScalar для объекта SQLQuery вы можете установить свойства переходного процесса. Однако, если это делается таким образом, вы должны установить ВСЕ свойства объекта таким образом (Hibernate не выполняет автозаполнение каких-либо свойств)

Также вам придется использовать метод setResultTransformer также для объекта SQLQuery. Поэтому, чтобы закончить мой предыдущий пример, мне пришлось бы добавить следующий код в my impl.

// query.addEntity(AboutMe.class); <- this contradicts the setResultTransformer 
query.setParameter("id",id); 

query.addScalar("id",StandardBasicTypes.LONG); 
query.addScalar("image_url",StandardBasicTypes.LONG); 
query.addScalar("liked",StandardBasicTypes.LONG); 
query.addScalar("numLikes",StandardBasicTypes.LONG); 

query.setResultTransformer(Transformers.aliasToBean(Object.class)); 

где Object - это класс, который я хочу использовать, который объявляет все эти свойства.

+0

Я чувствую, что вы пытаетесь сделать ваш проект очень сложным здесь, что не нужно. Возможно, вам стоит взглянуть на вашу модель данных или увидеть некоторые примеры того, как можно улучшить ситуацию. Для меня, похоже, вы пытаетесь отойти от того, на что рассчитан Hibernate. – Vaelyr

+0

ОК. Позвольте мне, возможно, перефразировать вопрос, как я могу поместить производные данные, которые не сохраняются в одной таблице в объект, и вернуть его. пока это единственный способ, который я видел. или набивка в pojo, но это будет тот же процесс. –

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