Выбор пользователя для спящего режима / JPA - PullRequest
0 голосов
/ 24 января 2011

Я использую JPA поверх Hibernate, с настройкой аннотации.

Я ищу пользовательский метод «выбор», который позволил бы мне узнать размер «ленивой коллекции» без получения коллекции.

Я попробовал это, но безуспешно:

@Entity
@Table(name="t_test")   
public class Test {

@Id
@Column(name="name", length=50)
private String name;

@Column(name="first_name", length=50)
private String firstName;

@ElementCollection(fetch=FetchType.LAZY)
@JoinTable(name = "tj_test_nicknames", schema="",
    joinColumns = {@JoinColumn(name = "name")} 
)
@ForeignKey(name = "FK_test_nickname")
@Column(name="nickname", nullable=false)
private Set<String> nickNames = new HashSet();

@Formula("(SELECT COUNT(t.nickname) FROM tj_test_nicknames t WHERE t.name = name)")
private int counter;

В моем тесте я просто пытаюсь отобразить номер счетчика (с классикой для)

Test test = new Test();
test.setFirstName("prenom");
test.setName("nom" + Math.random());

Set<String> nickNames = new HashSet<String>();
nickNames.add("surnom");
nickNames.add("toto");
test.setNickNames(nickNames);

testDAO.save(test);

Collection<Test> tests = testDAO.getAll();
if(tests!=null){
    for (Test testT : tests) {
        logger.info("Number of nicknames: " + testT.getNumberOfNicknames());
        logger.info("Size of the list:: " + testT.getNickNames().size());
    }
}

Но я отображаю 0 для каждого экземпляра объекта (который имеет инстанцированную ленивую коллекцию).

org.hibernate.pretty.Printer список объектов: ...

Test {counter = 2, name = nom0.46579385535806883, firstName = prenom, nickNames =}

Test {counter = 0, name = nom0.6489676574372193, firstName = prenom, nickNames = [toto, surnom]}

Test {counter = 2, name = nom0.6362777689140984, firstName = prenom, nickNames =}

Test {counter = 2, name = nom0.15039481770844532, firstName = prenom, nickNames =}

Test {counter = 2, name = nom0.5580054662200352, firstName = prenom, nickNames =}

EDIT: Итак, я понял, что когда создается экземпляр ленивой коллекции nickNames, он возвращает 0, а не хорошее число.

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

У кого-нибудь есть идеи, как это сделать?

Спасибо

Ответы [ 2 ]

1 голос
/ 24 января 2011

Запрос должен выглядеть следующим образом (не должно быть никакого ключевого слова таблицы):

((Integer) session.createQuery ("select count (*) from ...."). Iterate ().next ()) .intValue ();

Это из спящего режима документация

0 голосов
/ 24 января 2011

В любом случае ваш запрос выглядит немного странно: я ожидаю, что ID - это ваш первичный ключ, поэтому считайте, где id = XYZ может возвращать только 0 или 1. - Возможно, проблема в вашем запросе.

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