我试图让所有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)")
答案 0 :(得分:0)
你在SQL中思考太多,这正是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的实际状态。