【问题标题】:Passing two parameters to a named query将两个参数传递给命名查询
【发布时间】:2013-04-08 19:05:26
【问题描述】:

我对我的实体“干预”有以下命名查询:

 @NamedQuery(name = "Intervention.findNextMission", query = " SELECT i FROM Intervention  i       WHERE i.heureDebut> :DateToBeSpecified and i.idAgent= :idAgent")`

我不知道如何在我的代码中通过传递两个参数来调用此查询:日期、id。通常应该是这样的:

List <Intervention> ListOfInterventions = em.createNamedQuery("Intervention.findNextMission").setParameter().getResultList();

在 setParameter() 的括号之间放什么??

这里遵循我的实体干预的代码:

    @Entity
@Table(name = "intervention")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Intervention.findAll", query = "SELECT i FROM Intervention i"),
    @NamedQuery(name = "Intervention.findByIdIntervention", query = "SELECT i FROM Intervention i WHERE i.idIntervention = :idIntervention"),
    @NamedQuery(name = "Intervention.findByHeureDebut", query = "SELECT i FROM Intervention i WHERE i.heureDebut = :heureDebut"),
    @NamedQuery(name = "Intervention.findByHeureFin", query = "SELECT i FROM Intervention i WHERE i.heureFin = :heureFin"),
    @NamedQuery(name = "Intervention.findNextMission", query = " SELECT i FROM Intervention i WHERE i.heureDebut> :DateToBeSpecified and i.idAgent= :idAgent")})
public class Intervention implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "IdIntervention", nullable = false, length = 50)
    private String idIntervention;
    @Basic(optional = false)
    @NotNull
    @Column(name = "HeureDebut", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date heureDebut;
    @Basic(optional = false)
    @NotNull
    @Column(name = "HeureFin", nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private Date heureFin;
    @Lob
    @Size(max = 65535)
    @Column(name = "NotesGeneral", length = 65535)
    private String notesGeneral;
    @JoinColumn(name = "IdValidation", referencedColumnName = "IdValidation", nullable = false)
    @ManyToOne(optional = false)
    private Tablevalidation idValidation;
    @JoinColumn(name = "IdNatureIntervention", referencedColumnName =  "IdNatureIntervention", nullable = false)
    @ManyToOne(optional = false)
    private Tablenatureintervention idNatureIntervention;
    @JoinColumn(name = "IdAgent", referencedColumnName = "IdAgent", nullable = false)
    @ManyToOne(optional = false)
    private Agent idAgent;
    @JoinColumn(name = "RefContrat", referencedColumnName = "RefContrat", nullable = false)
    @ManyToOne(optional = false)
    private Projet refContrat;

    public Intervention() {
    }
    //getters and setters 
}

【问题讨论】:

    标签: jakarta-ee jpa ejbql


    【解决方案1】:

    setParameter 接受 (int position,Object value)(String parameterName,Object value)。所以你的代码可能看起来像:

    Date aDate=....
    Long anId=....   
    List ListOfInterventions = em.createNamedQuery("Intervention.findNextMission")
      .setParameter("DateToBeSpecified",aDate,avax.persistence.TemporalType,DATE)
      .setParameter("idAgent",anId).getResultList();
    

    请注意,当您使用 Date 时,您应该指定预期的 TemporalType

    【讨论】:

    • 嗨 Carlo 我试过了,但它不起作用,它抛出以下异常: javax.servlet.ServletException: java.lang.IllegalArgumentException: 你试图设置一个 java.lang.参数 idAgent 的 lang.String 与预期类型的​​类 MajanTelepointage.entities.Agent 来自查询字符串 SELECT i FROM Intervention i WHERE i.heureDebut> :DateToBeSpecified 和 i.idAgent= :idAgent。
    • 抱歉,我还没有挖掘到你的 Intervention 对象。 Intervention.idAgent 实际上是一个 Agent 实例,所以我建议您修改查询以引用 Agent 类型上的 id,如 ` ... i.idAgent.idAgent=:idAgent ... `(假设Agent.idAgent 是一个字符串)
    猜你喜欢
    • 1970-01-01
    • 2018-03-08
    • 1970-01-01
    • 2017-09-27
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多