繁体   English   中英

在JPA中比较整数

[英]Comparing integers in JPA

我正在尝试获取状态(INT)1、2、3、4的所有Dna实体,但是Eclipselink给我错误。

ReadAllQuery(name =“ Dna.findAllButDeleted” referenceClass = Dna jpql =“ SELECT r来自Dna r,其中r.status = 1或r.status = 2 OR r.status = 3或r.status = 4”)

@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异常描述:用于对象比较的参数的类不正确。 表达式:[Base 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)")

您在SQL中考虑的太多了,这恰恰是JPA将成为您最大的敌人。 Status可能是数据库中的一个int,但在您的实体中,它是一个链接到ManyToOne批注中的单独的Status对象-该错误恰恰说明了这一点。 因此,具有硬整数检查的JPQL类似于:

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

假设状态实体的id列名为“ id”; 调整为您正在使用的任何内容。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM