简体   繁体   English

如何在Spring Data JPA中编写下面的SQL查询?

[英]How to Write below SQL Query in Spring Data JPA?

SELECT * FROM vnfconfigdetails where vnfid='1234' and (creationdate >= '2018-07-12' and creationdate <= '2018-07-15');

I have try bellow JPA query but empty result coming. 我已经尝试了以下JPA查询,但结果空了。

@Query(value= " SELECT * FROM vnfconfigdetails where (creationdate >= :startDate AND creationdate <= :endDate ) AND vnfid =:vnfid", nativeQuery = true)
List<VnfConfigDetailsDB> findByVnfidAndCreationdate(@Param("vnfid") String vnfid,@Param("startDate") Date startDate, @Param("endDate")Date endDate);

ShowSQL Query- ShowSQL查询-

@Entity
@Table(name = "vnfconfigdetails", schema = "testreports")
public class VnfConfigDetailsDB {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue
    private int id;

    @Column(name = "vnfid")
    private String vnfid;

    @Column(name = "vnfversion")
    private String vnfversion;

    @Column(name = "vnfname")
    private String vnfname;

    @Column(name = "configinfo")
    @Lob
    private String configinfo;

    @Column(name = "creationdate")
    private Date creationdate;

    @Column(name = "lastupdated")
    private Date lastupdated;

    @Column(name = "status")
    private String status;


    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getVnfid() {
        return vnfid;
    }

    public void setVnfid(String vnfid) {
        this.vnfid = vnfid;
    }

    public String getVnfversion() {
        return vnfversion;
    }

    public void setVnfversion(String vnfversion) {
        this.vnfversion = vnfversion;
    }

    public String getVnfname() {
        return vnfname;
    }

    public void setVnfname(String vnfname) {
        this.vnfname = vnfname;
    }

    public String getConfiginfo() {
        return configinfo;
    }

    public void setConfiginfo(String configinfo) {
        this.configinfo = configinfo;
    }

    public Date getCreationdate() {
        return creationdate;
    }

    public void setCreationdate(Date creationdate) {
        this.creationdate = creationdate;
    }


    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }



    public Date getLastupdated() {
        return lastupdated;
    }

    public void setLastupdated(Date lastupdated) {
        this.lastupdated = lastupdated;
    }

}

This should work. 这应该工作。

 List<VnfConfigDetailsDB> findByVnfidAndCreationdateBetween(String vnfid, Date startDate, Date endDate)

You don't need @Query . 您不需要@Query When you say Between, sping-data will formulate the query correctly. 当您说之间时,sping-data将正确地构成查询。

In your case you use native query. 在您的情况下,您使用本机查询。 This is not JPQL so you have to do some changes. 这不是JPQL,因此您必须进行一些更改。

  1. Do not use @Param infront of parameters in the method: Please remove @Param("vnfid"), @Param("startDate") and @Param("endDate"). 请勿在方法中使用参数的@Param开头:请删除@Param(“ vnfid”),@ Param(“ startDate”)和@Param(“ endDate”)。

  2. Replace all :paramName with ?. 将所有:paramName替换为?。 For example replace :startDate with ?NumberOfParam and so on inside of the query: 例如,在查询内部将:startDate替换为?NumberOfParam,依此类推:

     @Query(value= " SELECT * FROM vnfconfigdetails where (creationdate >= ?2 AND creationdate <= ?3 ) AND vnfid =?1", nativeQuery = true) List<VnfConfigDetailsDB> findByVnfidAndCreationdate(String vnfid,Date startDate, Date endDate); 

If you want to use JPQL then you have to remove nativeQuery = true and your query will look something like that: 如果要使用JPQL,则必须删除nativeQuery = true,查询将如下所示:

@Query(value= " SELECT v FROM VnfConfigDetailsDB v where (v.creationdate >= :startDate AND v.creationdate <= :endDate ) AND v.vnfid =:vnfid")
List<VnfConfigDetailsDB> findByVnfidAndCreationdate(@Param("vnfid") String vnfid,@Param("startDate") Date startDate, @Param("endDate")Date endDate);

Remove @Param 删除@Param

@Query(value = "SELECT * FROM vnfconfigdetails where (creationdate >= ?2 AND   creationdate <= ?3 ) AND vnfid =?1", nativeQuery = true)
List<VnfConfigDetailsDB> findByVnfidAndCreationdateBetween(String vnfid, Date startDate, Date endDate);

In the entity class add the temporal annotation. 在实体类中添加时间注释。 This annotation must be specified for persistent fields or properties of type java.util.Date and java.util.Calendar. 必须为java.util.Date和java.util.Calendar类型的持久字段或属性指定此批注。 It may only be specified for fields or properties of these types. 只能为这些类型的字段或属性指定。

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "creationdate", columnDefinition = "DATETIME")
private Date creationdate;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "lastupdated", columnDefinition = "DATETIME")
private Date lastupdated;

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

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