2014-10-19 5 views
1

Я пытаюсь сделать выбор, используя несколько простых условий, но я продолжаю получать исключение Attempt to store an instance of a non persistable type com.objectdb.jpa.criteria.Expressions$h (error 303)

public Person read(String surname, String name, String password) throws NonUniqueResultException, NoResultException, PersistenceException, UserException { 
     EntityManager entityManager = entityManagerFactory.createEntityManager(); 
     Person Person = null; 
     try { 
      entityManager.getTransaction().begin(); 
      CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); 
      CriteriaQuery<Person> criteriaQuery = criteriaBuilder.createQuery(Person.class); 
      Root<Person> root = criteriaQuery.from(Person.class); 
      criteriaQuery.select(root); 
      ParameterExpression<String> name2 = criteriaBuilder.parameter(String.class); 
      ParameterExpression<String> surname2 = criteriaBuilder.parameter(String.class); 
      ParameterExpression<String> password2 = criteriaBuilder.parameter(String.class); 
      criteriaQuery.where(
        criteriaBuilder.equal(root.get("name"), criteriaBuilder.literal(name2)), 
        criteriaBuilder.equal(root.get("surname"), criteriaBuilder.literal(surname2)), 
        criteriaBuilder.equal(root.get("password"), criteriaBuilder.literal(password2)) 
      ); 
      TypedQuery<Person> query = entityManager.createQuery(criteriaQuery); 
      query.setParameter("name", name2); 
      query.setParameter("surname", surname2); 
      query.setParameter("password", password2); 
      System.out.println("sout: " + query.toString()); 
      System.out.println("sout2: " + query.getSingleResult()); 
      entityManager.getTransaction().commit(); 
     } finally { 
      if (entityManager.getTransaction().isActive()) { 
       entityManager.getTransaction().rollback(); 
      } 
      entityManager.close(); 
     } 
     return Person; 
    } 

Выход:

sout: SELECT $1 FROM Person $1 WHERE (($1.name=:p1) AND ($1.surname=:p1) AND ($1.password=:p1)) 
    [ObjectDB 2.5.7_03] javax.persistence.PersistenceException 
Attempt to store an instance of a non persistable type com.objectdb.jpa.criteria.Expressions$h (error 303) 
    at com.objectdb.jpa.JpaQuery.getSingleResult(JpaQuery.java:754) 
    ... 

ответ

1

В коде можно определить три параметра, а затем обернуть их литералов. Отправка этих недопустимых литералов не выполняется, поскольку эти выражения не поддерживаются ObjectDB.

Try:

ParameterExpression<String> name2 = criteriaBuilder.parameter(String.class); 
    ParameterExpression<String> surname2 = criteriaBuilder.parameter(String.class); 
    ParameterExpression<String> password2 = criteriaBuilder.parameter(String.class); 
    criteriaQuery.where(
     criteriaBuilder.equal(root.get("name"), name2), 
     criteriaBuilder.equal(root.get("surname"), surname2), 
     criteriaBuilder.equal(root.get("password"), password2) 
    ); 

параметры должны быть установлены:

query.setParameter(name2, name); 
    query.setParameter(surname2, surname); 
    query.setParameter(password2, password); 
+0

Применение этих изменений в настоящее время приводит к улучшению выхода: 'Sout: SELECT $ 1 от человека $ 1 WHERE (($ 1.name =: p1) AND ($ 1.surname =: p2) AND ($ 1.password =: p3)) '. Тем не менее, я все еще получаю '[ObjectDB 2.5.7_03] javax.persistence.PersistenceException Попытка сохранить экземпляр непостоянного типа com.objectdb.jpa.criteria.Expressions $ h (ошибка 303)' при выполнении 'System.out .println ("sout2:" + query.getSingleResult()); ' – ThreaT

+0

Я использую ObjectDB версии 2.5.7_03. Объект Person реализует Serializable. У меня нет объекта objectdb.conf, потому что я не хочу использовать какие-либо конфигурации xml/text (только для серверной ** **). 'Person' имеет больше переменных-членов, чем просто' name', 'surname' и' password' - не уверен, что это имеет значение. – ThreaT

+0

Я изменил 'query.setParameter (« name », name2);' lines использовать параметры в сигнатуре. то есть 'query.setParameter (« имя », имя);'. Это, похоже, решило проблему. Однако теперь я получаю 'Попытка выполнить запрос без аргумента для параметра p3 (ошибка 775)' – ThreaT