如何在JPQL中使用JPA枚举where子句?

前端之家收集整理的这篇文章主要介绍了如何在JPQL中使用JPA枚举where子句?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个枚举作为实体的属性.当我尝试在JPQL suqry中使用枚举时,会给出错误.除了传递它作为参数,使用什么正确的方法

枚举是

package com.divudi.data;

public enum Sex {
    Male,Female,Unknown,Other,}

实体是

package com.divudi.entity.lab;

import com.divudi.data.Sex;
import com.divudi.entity.Item;
import com.divudi.entity.WebUser;
import java.io.Serializable;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Lob;
import javax.persistence.ManyToOne;
import javax.persistence.Temporal;

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
public class InvestigationItemValueFlag extends InvestigationItemValue implements Serializable {

    private static final long serialVersionUID = 1L;
    @Enumerated(EnumType.STRING)
    Sex sex;
    @ManyToOne
    InvestigationItem investigationItemOfLabelType;
    @ManyToOne
    private InvestigationItem investigationItemOfValueType;
    @ManyToOne
    InvestigationItem investigationItemOfFlagType;
    @ManyToOne
    Item item;
    long fromAge;
    long toAge;
    @Lob
    private String flagMessage;
    @Lob
    String highMessage;
    @Lob
    String lowMessage;
    @Lob
    String normalMessage;
    boolean displayFlagMessage;
    boolean displayHighMessage;
    boolean displayLowMessage;
    boolean displayNormalMessage;

    public InvestigationItem getInvestigationItemOfLabelType() {
        return investigationItemOfLabelType;
    }

    public void setInvestigationItemOfLabelType(InvestigationItem investigationItemOfLabelType) {
        this.investigationItemOfLabelType = investigationItemOfLabelType;
    }



    public String getHighMessage() {
        return highMessage;
    }

    public void setHighMessage(String highMessage) {
        this.highMessage = highMessage;
    }

    public String getLowMessage() {
        return lowMessage;
    }

    public void setLowMessage(String lowMessage) {
        this.lowMessage = lowMessage;
    }

    public String getNormalMessage() {
        return normalMessage;
    }

    public void setNormalMessage(String normalMessage) {
        this.normalMessage = normalMessage;
    }

    public boolean isDisplayFlagMessage() {
        return displayFlagMessage;
    }

    public void setDisplayFlagMessage(boolean displayFlagMessage) {
        this.displayFlagMessage = displayFlagMessage;
    }

    public boolean isDisplayHighMessage() {
        return displayHighMessage;
    }

    public void setDisplayHighMessage(boolean displayHighMessage) {
        this.displayHighMessage = displayHighMessage;
    }

    public boolean isDisplayLowMessage() {
        return displayLowMessage;
    }

    public void setDisplayLowMessage(boolean displayLowMessage) {
        this.displayLowMessage = displayLowMessage;
    }

    public boolean isDisplayNormalMessage() {
        return displayNormalMessage;
    }

    public void setDisplayNormalMessage(boolean displayNormalMessage) {
        this.displayNormalMessage = displayNormalMessage;
    }





    public Item getItem() {
        return item;
    }

    public void setItem(Item item) {
        this.item = item;
    }



    public InvestigationItemValueFlag() {
    }

    public Sex getSex() {
        return sex;
    }

    public void setSex(Sex sex) {
        this.sex = sex;
    }

    public long getFromAge() {
        return fromAge;
    }

    public void setFromAge(long fromAge) {
        this.fromAge = fromAge;
    }

    public long getToAge() {
        return toAge;
    }

    public void setToAge(long toAge) {
        this.toAge = toAge;
    }

    public String getFlagMessage() {
        return flagMessage;
    }

    public void setFlagMessage(String flagMessage) {
        this.flagMessage = flagMessage;
    }

    public InvestigationItem getInvestigationItemOfValueType() {
        return investigationItemOfValueType;
    }

    public void setInvestigationItemOfValueType(InvestigationItem investigationItemOfValueType) {
        this.investigationItemOfValueType = investigationItemOfValueType;
    }

    public InvestigationItem getInvestigationItemOfFlagType() {
        return investigationItemOfFlagType;
    }

    public void setInvestigationItemOfFlagType(InvestigationItem investigationItemOfFlagType) {
        this.investigationItemOfFlagType = investigationItemOfFlagType;
    }





}

JSF托管bean如下(仅相关代码)

public String getPatientDynamicLabel(InvestigationItem ii,Patient p) {
    String dl;
    String sql;
    dl = ii.getName();
    long ageInDays = commonFunctions.calculateAgeInDays(p.getPerson().getDob(),Calendar.getInstance().getTime());
    sql = "select f from InvestigationItemValueFlag f where  f.fromAge < " + ageInDays + " and f.toAge > " + ageInDays + " and f.investigationItemOfLabelType.id = " + ii.getId();
    List<InvestigationItemValueFlag> fs = getIivfFacade().findBysql(sql);
    for (InvestigationItemValueFlag f : fs) {
        if (f.getSex() == p.getPerson().getSex()) {
            dl = f.getFlagMessage();
        }
    }
    return dl;
}

错误

java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: 
Exception Description: Error compiling the query [select f from InvestigationItemValueFlag f where f.sex = com.divudi.data.Male and f.fromAge < 12419 and f.toAge > 12419 and f.investigationItemOfLabelType.id = 2678],line 1,column 57: unknown identification variable [com]. The FROM clause of the query does not declare an identification variable [com].

解决方法

您不应该使用字符串连接来将参数传递给查询.您应该使用参数(命名,最喜欢的):
String jpql = 
    "select f from InvestigationItemValueFlag f"
    + " where f.sex = :sex"
    + " and ...";
Query query = em.createQuery(jpql);
query.setParameter("sex",Sex.Male);

这将会照顾正确的转义,正确的sql生成(枚举可以映射为字符串或序号),并避免JPQL注入攻击.

也请不要命名sql或findBysql,而是实际上是JPQL.

原文链接:https://www.f2er.com/java/121446.html

猜你在找的Java相关文章