比较JPA中的整数

时间:2015-08-18 11:09:55

标签: java mysql hibernate jpa eclipselink

我试图让所有Dna实体获得状态(INT)1,2,3,4,但Eclipselink给我错误。

  

ReadAllQuery(name =“Dna.findAllButDeleted”referenceClass = Dna jpql =“SELECT r FROM Dna r,其中r.status = 1或r.status = 2或r.status = 3或r.status = 4”)< / p>

@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 Persistence Services - 2.5.2.v20140319-9ad6abd):org.eclipse.persistence.exceptions.QueryException   异常描述:对象比较的参数类不正确。   表达:[   基础com.pako.entity.Dna]   映射:[org.eclipse.persistence.mappings.ManyToOneMapping [status]]   争论:[1]

编辑: 我的错,现在我看到了问题。在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 个答案:

答案 0 :(得分:0)

你在SQ​​L中思考太多,这正是JPA将成为你最大的敌人。状态可以是数据库中的int,但在您的实体中,它是一个单独的Status对象,在ManyToOne注释中链接 - 错误解释了这一点。因此,带有硬整数检查的JPQL将类似于:

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

假设Status实体的id列被命名为&#39; id&#39 ;;适应你正在使用的任何东西。

请注意:我自己不会使用此代码,带有幻数的查询对可读性不利。您无法在不首先查看数据库的情况下查看1-4的实际状态。