2014-01-23 4 views
1

В Hibernate есть способ вернуть объект или список объектов, которые не имеют данных, которые не сохраняются в таблице как часть объекта?возвращает не сохраняющиеся данные как часть объекта

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

long id; 
String message; 
long profile_id; 

//non-persisted properties 

long numLikes; 
boolean isLiked; 

тогда был еще один объект для отслеживания того, кто понравился твит, такие как

long id; 
long liked_id; 
long profile_id; 
boolean liked; 

как бы я (могу ли я) настроить твист-объект, чтобы я мог видеть количество понравившихся элементов в твист-объекте? запрос будет выглядеть как-то

Select *, count(likes1.id) as numLikes, isNull(liked1.liked,0) as isLiked from tweets 
left join (select id,liked_id from likes where liked_id = tweets.id) as likes1 on  tweets.id = likes1 .liked_id 
left join (select liked_id,liked from likes where profile_id = :authenticated_User) as  liked1 on tweets.id = liked1.liked_id 
where..... 

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

(предполагая, что все свойства называются правильно в SQL запросе данные и возвращается, как и ожидалось, я знаю, что есть вещи в моем примере, что сломается.)

+1

Используйте объекты для сопоставления столбцов соответствующей таблицы и ассоциаций с другими таблицами. Для остальных (агрегированные значения, такие как количество ретвитов или предпочтений), затем используйте запросы и возвращайте DTO, содержащие данные, возвращаемые запросом. –

+0

Итак, вы сказали, что мне нужно разделить объект tweet на два объекта, чтобы сделать запрос, чтобы получить объект Tweet, а затем выполнить цикл через возвращаемый набор данных и сделать другой запрос для каждого твита, чтобы вернуть агрегированные значения? это простой способ, но есть ли способ обойти это? –

+0

Нет, это не то, что я имел в виду. Я имел в виду, что вы должны выполнить запрос, который позволит получить необходимые данные из базы данных, если это возможно, и использовать класс DTO для хранения данных, содержащихся в каждой строке, возвращаемой этим запросом. Не все должно быть сущностью. –

ответ

0

Мое предложение делать это таким образом (использовать только в случае, если не используйте DTOs):

1) создать класс TweetRecordFilter, чтобы помочь фильтр TweetRecord

public class TweetRecordFilter(){ 

private long tweetId; 
private long personId; 
private long profileId; 
private boolean liked; 

//create setters and getters for all attributes mentioned above 

} 

2) создать метод для нахождения TweetRecords (вы сказали, что они отслеживают, кто любит что)

public List<TweetRecord> findTweetRecordByFilter(TweetRecordFilter tweetrecordFilter){ 
    // return found records that have properties that were set to tweetRecordFilter 
    // I suggest do a select using PreparedStatement 
    /* here write that code*/ 
} 

3) создать метод для выбора твиты

public Tweet findTweetById(int tweetId){ 
    // find tweet that has tweetId and say you have found one, let's call it "foundTweet" 
    // I suggest do a select using PreparedStatement 
    /* here write that code*/ 

    // find all tweetRecord that have specific profile_id 
    TweetRecordFilter tweetRecordFilter = new TweetRecordFilter(); 
    tweetRecordFilter.setProfileId(foundTweet.getProfileId); 
    tweetRecordFilter.setLiked(true); 
    List<TweetRecord> tweetRecords = findTweetRecordByFilter(tweetRecordFilter); 

    // set the number of likes for tweet 
    if(tweetRecords != null){ 
     foundTweet.setLikesCount(tweetRecords.size()); 
    } 

    return foundTweet; 
} 

Так все вместе взятые в качестве практического примера:

int tweetId = 1; 
Tweet tweet = findTweetById(1); 
int numberOfLikes = tweet.getNumberOfLikes; 

Больше на PreparedStatement вы можете найти here.

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