gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:45:40 24 4
gpt4 key购买 nike

我有一个枚举作为实体的属性。当我尝试在 JPQL 查询中使用枚举时,它会出错。除了将其作为参数传递之外,正确的方法是什么?

枚举是

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 Managed 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 注入(inject)攻击。

也请不要命名 sqlfindBySQL它实际上是 JPQL。

关于jpa - 如何在 JPQL where 子句中使用 JPA 枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17759546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com