2015-08-18 7 views
0

Я пытаюсь получить все объекты Dna со статусом (INT) 1,2,3,4, но Eclipselink дает мне ошибку.Сравнение целых чисел в JPA

ReadAllQuery (имя = "Dna.findAllButDeleted" referenceClass = Днк jpql = "SELECT г от Dna г, где r.status = 1 ИЛИ r.status = 2 или r.status = 3 или 4 = r.status «)

@GET 
@Path("all") 
@Produces({"application/xml", "application/json"}) 
public List<Dna> findAllButDeleted(){ 
    System.out.println("**********findAllButDeleted*************"); 
    Query query = em.createNamedQuery("Dna.findAllButDeleted"); 
    List<Dna> lista = query.getResultList(); 
    return lista; 
} 

@NamedQuery(name = "Dna.findAllButDeleted", query = "SELECT r FROM Dna r where r.status =1 OR r.status=2 OR r.status=3 OR r.status=4"), 

ОШИБКА

Исключение [EclipseLink-6078] (Eclipse, послесвечение услуги - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.QueryException Исключение Описание: Класс аргумента для сравнения объектов неверен. Выражение: [ Base com.pako.entity.Dna] Mapping: [org.eclipse.persistence.mappings.ManyToOneMapping [состояние]] Аргумент: [1]

EDIT: Моя ошибка, теперь Я вижу проблему. Статус объекта Dna не является целым, а объектом. Как использовать несколько параметров? Похоже, что он использует только последний.

@ManyToOne(cascade = CascadeType.MERGE) 
    private Dnastatus status; 

    Dnastatus oneStatus = new Dnastatus(new Integer(1)); 
    Dnastatus twoStatus = new Dnastatus(new Integer(2)); 
    Dnastatus threeStatus = new Dnastatus(new Integer(3)); 

    Query query = em.createNamedQuery("Dna.findAllButDeleted"). 
      setParameter("status", oneStatus). 
      setParameter("status", twoStatus). 
      setParameter("status", threeStatus); 
@NamedQuery(name = "Dna.findAllButDeleted", query = "SELECT r FROM Dna r where r.status = :status"), 

EDIT2: Решение

List statusList = new ArrayList(); 
    statusList.add(oneStatus); 
    statusList.add(twoStatus); 
    statusList.add(threeStatus); 
    statusList.add(fourStatus); 

Query query = em.createNamedQuery("Dna.findAllButDeleted"). 
      setParameter("statusList", statusList); 
@NamedQuery(name = "Dna.findAllButDeleted", query = "SELECT r FROM Dna r where r.status IN (:statusList)") 
+1

Показать объект 'Dna'. – Kayaman

+0

Y ur не использует запрос типа '@NamedQuery (name =" Dna.findAllButDeleted ", query =" SELECT r FROM Dna r где r.status In (1,2,3,4) "),' –

+0

Показан поле " статус "класса" Dna "является обязательным условием для любого комментария. EclipseLink ясно думает, что это поле отношения N-1, поэтому не может быть целым числом. Так почему бы не показать это? –

ответ

0

Вы думаете, слишком много в SQL, который является точно, как JPA будет вашим злейшим врагом. Статус может быть int в базе данных, но в ваших сущностях это отдельный объект статуса, связанный в аннотации ManyToOne - ошибка объясняет именно это. Так JPQL с жесткой проверкой целочисленной будет что-то вроде:

SELECT r FROM Dna r where r.status.id in 1,2,3,4 

Предполагая, что столбец Идентификатора объекта Status называется «идентификатор»; приспосабливайтесь к тому, что вы используете.

Просто для того, чтобы отметить: я бы не использовал этот код сам, запросы с магическими номерами плохо для читаемости. Вы не можете видеть, какой статус 1-4 на самом деле не нужен, прежде чем искать его в базе данных.

+0

. Поэтому мне нужно сначала перейти к БД и получить объекты состояния и использовать их в namedQuery? Не могли бы вы рассказать мне, как это сделать? – Sami

+0

Простым способом может быть выбор NOT status 5, но возможно ли это с помощью JPQL? – Sami

+0

@ Свами, для чего предназначены книги, а не SO – Gimby

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