Play! Framework: использование метода find () для коллекции - PullRequest
2 голосов
/ 05 сентября 2011

Давайте предположим, что класс User с этими полями:

@Entity
public class User extends Model {
    public String email;
    public String password;
    @ElementCollection
    public List<String> stringList;
}

Я ищу способ выполнить запрос к базе данных, чтобы найти всех пользователей, у которых есть заданная строка, в свой stringList, что-то вроде

List<User> usersHelloWorld = User.find("byStringList", "HelloWorld").fetch();

Но, конечно, это не работает.Есть ли способ заставить его работать?

Редактировать:

Вот мои фактические поля класса:

@Entity
public class User extends Model {
    public String email;
    public String password;
    public String firstname;
    public String lastname;
    public String gender;
    public String fbId;
    public String googleId;
    @ElementCollection
    public List<String> eventTopicIds;
    @Transient
    UserEventBuffer eventBuffer;
    @Transient
    public String fbAccessToken;
    public String googleAccessToken;
}

С этим запросом:

List<User> u = User.find("SELECT u from User u where ? IN u.eventTopicIds", "internalns_rootTopic1").fetch();

Я получаю эту ошибку:

Произошло исключение JPAQueryException: Ошибка при выполнении запроса SELECT u от пользователя u где?IN u.eventTopicIds: синтаксическая ошибка в операторе SQL «ВЫБЕРИТЕ USER0_.ID КАК ID3_, USER0_.EMAIL AS EMAIL3_, USER0_.FBID AS FBID3_, USER0_.FIRSTNAME AS FIRSTNAME3_, USER0_.GENDER ASGEND0_GUSER ASG, USER0_GGUS ASG3_ENG, ASGEND3_GUSER, GGLEER_G, USER0.GOOER ASGEND3_GUSER AS GENDER3.GOOGLEID AS GOOGLEID3_, USER0_.LASTNAME AS LASTNAME3_, USER0_.PASSWORD AS PASSWORD3_ ИЗ ПОЛЬЗОВАТЕЛЯ USER0_ CROSS JOIN USER_EVENTTOPICIDS EVENTTOPIC1_ ГДЕ USER0_.ID = EVENTTOPIC1_.USER_ID И (?) ()?ожидается "НЕ, СУЩЕСТВУЕТ, ВЫБРАТЬ, ИЗ";Оператор SQL: выберите user0_.id в качестве id3_, user0_.email в качестве email3_, user0_.fbId в качестве fbId3_, user0_.firstname в качестве firstname3_, user0_.gender в качестве пола3_, user0_.googleAccessToken в качестве googleAc6_3_, user0_.googleId в качестве имени пользователя googled в качестве googledlastname3_, user0_.password как пароль3_ от пользователя user0_ перекрестное соединение User_eventTopicIds eventtopic1_, где user0_.id = eventtopic1_.User_id и (? in (.)) [42001-149]

1 Ответ

2 голосов
/ 05 сентября 2011

Обычно вы можете запускать запрос JPA, например

User.find("Select u from User as u inner join u.stringList as strings where ? in strings", "HelloWorld").fetch();

Сделал небольшой тест, мой объект имел электронные письма вместо строк, но он должен быть таким же, если вы не встретите несколько зарезервированных слов. Проблема заключалась не в ключевом слове in, мне пришлось присоединиться к stringList, чтобы использовать ключевое слово in. Немного быстрее маркера ранее:)

Надеюсь, это поможет.

...