почему мой запрос или запрос jpa не работает весной

Когда я запускаю этот запрос в своем весеннем проекте, он просто возвращает ошибку. Я пробовал разными способами, но безрезультатно, буду очень признателен, если кто-нибудь сможет мне помочь. У меня есть 3 таблицы: User, Role и User_Role, и мой адрес встроен. Также используйте таблицу соединений.

Все остальные классы: User ,Role и User_Role spring безопасность

    public List<User> getUsersByNameOrLogin(final String value){
    List<User> result = new ArrayList<User>(0);

    if(value ==null){
        return result;
    }

    final StringBuilder jpql = new StringBuilder("SELECT u FROM User u WHERE ");
    jpql.append(" u.lastname like  "+value);
   jpql.append(" OR u.firstname like  "+value);
    jpql.append(" OR u.email like  "+value);

    final String valueLike = "%"+value+"%";

    result =  entityManager.createQuery(jpql.toString(), User.class)
            .setParameter("lastname", valueLike)
           .setParameter("firstname", valueLike)
           .setParameter("email", valueLike)
            .getResultList();

    return result;
}  

И ошибка:

не удалось разрешить свойство: фамилия: пользователя [ВЫБЕРИТЕ u FROM пользователя u, ГДЕ u.lastname как pappo ИЛИ u.firstname как pappo ИЛИ u.email как pappo]

и все сообщение об ошибке:

    Exception in thread "main" java.lang.IllegalArgumentException: org.hibernate.QueryException:      could not resolve property: lastname of: User [SELECT u FROM se.guard.User u WHERE  u.lastname like  pappo OR u.firstname like  pappo OR u.email like  pappo]
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1222)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168)
at             org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:292)
at se.datalayer.service.UserService.getUsersByNameOrLogin(UserService.java:189)
at se.datalayer.main.Main.getUserByParam(Main.java:131)
at se.datalayer.main.Main.main(Main.java:31)
     Caused by: org.hibernate.QueryException: could not resolve property: lastname of:      User [SELECT u FROM se.guard.User u WHERE  u.lastname like  pappo OR u.firstname like      pappo OR u.email like  pappo]
at       org.hibernate.persister.entity.AbstractPropertyMapping.propertyException(AbstractPropertyMapping.java:81)
at        org.hibernate.persister.entity.AbstractPropertyMapping.toType(AbstractPropertyMapping.java:75)
        at    org.hibernate.persister.entity.AbstractEntityPersister.toType(AbstractEntityPersister.java:1451)
at org.hibernate.hql.ast.tree.FromElementType.getPropertyType(FromElementType.java:312)
at org.hibernate.hql.ast.tree.FromElement.getPropertyType(FromElement.java:487)
at org.hibernate.hql.ast.tree.DotNode.getDataType(DotNode.java:611)
at org.hibernate.hql.ast.tree.DotNode.prepareLhs(DotNode.java:263)
at org.hibernate.hql.ast.tree.DotNode.resolve(DotNode.java:210)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117)
at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113)
at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:868)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.expr(HqlSqlBaseWalker.java:1323)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.exprOrSubquery(HqlSqlBaseWalker.java:4387)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.comparisonExpr(HqlSqlBaseWalker.java:4004)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1909)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1859)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.logicalExpr(HqlSqlBaseWalker.java:1859)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.whereClause(HqlSqlBaseWalker.java:824)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:610)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:294)
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:237)
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:98)
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1760)
at    org.hibernate.ejb.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:277)
... 3 more

person user1067665    schedule 19.08.2012    source источник


Ответы (2)


Почему вы включаете переменную value, если хотите использовать именованные параметры? Кроме того, имена свойств чувствительны к регистру. Изменить на:

final String jpql = "SELECT u FROM User u WHERE "
  "    u.lastName  like :lastname" +;
  " OR u.firstName like :firstname" +;
  " OR u.email     like :email";

И да, StringBuilder здесь не нужен. Вы можете упростить его еще больше, используя только один параметр:

final String jpql = "SELECT u FROM User u WHERE "
  "    u.lastName  like :valueLike" +;
  " OR u.firstName like :valueLike" +;
  " OR u.email     like :valueLike";

result =  entityManager.createQuery(jpql, User.class)
        .setParameter("valueLike", valueLike)
        .getResultList();
person Tomasz Nurkiewicz    schedule 19.08.2012
comment
Может быть, вы должны указать, почему это работает сейчас ... (фамилия->фамилия). О, на второй взгляд, это была лишь одна из многих причин. НВМ - person esej; 19.08.2012
comment
@ user1067665: рассмотрите возможность принятия/подтверждения ответа, если ваша проблема решена. - person Tomasz Nurkiewicz; 19.08.2012
comment
Привет. Как писал Томаш, проблема была в StringBuilder. А кому небезразлично добавляю функцию метода поиска. - person user1067665; 20.08.2012

Решение после ответа Томаша:

    public Collection<User> findUserByAnyValue(String value)
{
    List<User> result = new ArrayList<User>(0);

    if(value ==null){
        return result;
    }

    final String searchParam = "%"+value+"%";

    final String query = "SELECT u FROM User u WHERE "+

              " u.firstname like :searchParam" +
              " OR u.firstname like :searchParam" +
              " OR u.lastname  like :searchParam" +
              " OR u.username  like :searchParam" +
              " OR u.password  like :searchParam" +
              " OR u.email     like :searchParam"+
              " OR u.address.street  like :searchParam"+
              " OR u.address.zipcode  like :searchParam"+
              " OR u.address.city like :searchParam";

            result =  entityManager.createQuery(query, User.class)
                    .setParameter("searchParam", searchParam)
                    .getResultList();

    return result;

}

Еще раз спасибо Томаш.

person user1067665    schedule 20.08.2012