首页 > 解决方案 > 存储库在 Spring Boot 中返回空列表

问题描述

我正在尝试编写一个简单的 REST 来从与我共享的表中提取记录。由于该表没有默认 ID 列,因此我将 pk 列嵌入到实体对象中。请在下面找到代码以供您查看。

我面临的问题是 repository.findByMediaType(其中 mediaType 是实体属性之一)返回空列表。我确保查询参数不为空,并且表中有传递参数的记录。我也试过 findAll 但没有用。我似乎找不到代码有什么问题。我是 Spring Boot 的新手,想知道调试它的不同方法。

服务实现类

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.hyb.enterprisedashboard.api.entity.Tenders;
import com.hyb.enterprisedashboard.api.repository.DashboardRepository;



@Service
public class DashboardServiceImpl implements DashboardService{

    Logger logger = LoggerFactory.getLogger(DashboardServiceImpl.class);

    @Autowired
    DashboardRepository dashboardRepository;

    @Override
    public List<Tenders> getTenderByMediaType(String mediaType) {

        List<Tenders> tenderList = dashboardRepository.findAll();
        //findByMediaType(mediaType);

        tenderList.stream().forEach(tender -> {
            logger.info("Order {} paid via {}",tender.getId().getOrderNumber(), tender.getMediaType());
        });

        return tenderList;
    }

}

实体类

import java.math.BigDecimal;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.EmbeddedId;
import javax.persistence.Entity;
import javax.persistence.Table;


@Entity
@Table(name = "TENDERS")
public class Tenders {

    /** The id. */
    @EmbeddedId
    private TendersPK id;

    /** The dateTime. */
    @Column(name="DATE_TIME")
    private Date dateTime;

    /** The tenderMedia. */
    @Column(name="TENDERED_MEDIA")
    private String tenderMedia;

    /** The mediaType. */
    @Column(name="MEDIA_TYPE")
    private String mediaType;

    /** The tenderAmount. */
    @Column(name="TENDERED_AMOUNT")
    private BigDecimal tenderAmount;

    /**
     * @return the id
     */
    public TendersPK getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(TendersPK id) {
        this.id = id;
    }


    /**
     * @return the dateTime
     */
    public Date getDateTime() {
        return dateTime;
    }

    /**
     * @param dateTime the dateTime to set
     */
    public void setDateTime(Date dateTime) {
        this.dateTime = dateTime;
    }

    /**
     * @return the tenderMedia
     */
    public String getTenderMedia() {
        return tenderMedia;
    }

    /**
     * @param tenderMedia the tenderMedia to set
     */
    public void setTenderMedia(String tenderMedia) {
        this.tenderMedia = tenderMedia;
    }

    /**
     * @return the mediaType
     */
    public String getMediaType() {
        return mediaType;
    }

    /**
     * @param mediaType the mediaType to set
     */
    public void setMediaType(String mediaType) {
        this.mediaType = mediaType;
    }

    /**
     * @return the tenderAmount
     */
    public BigDecimal getTenderAmount() {
        return tenderAmount;
    }

    /**
     * @param tenderAmount the tenderAmount to set
     */
    public void setTenderAmount(BigDecimal tenderAmount) {
        this.tenderAmount = tenderAmount;
    }

    @Override
    public String toString() {
        return "Tenders [id=" + id + ", dateTime=" + dateTime + ", tenderMedia=" + tenderMedia + ", mediaType="
                + mediaType + ", tenderAmount=" + tenderAmount + "]";
    }

}

PK 嵌入式类

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.Embeddable;


@Embeddable
public class TendersPK implements Serializable{

    /**  The Constant serialVersionUID.*/
    private static final long serialVersionUID = 1L;

    /**
     * 
     */
    public TendersPK() {
    }

    /**
     * @param storeNumber
     * @param orderNumber
     */
    public TendersPK(long storeNumber, long orderNumber) {
        super();
        this.storeNumber = storeNumber;
        this.orderNumber = orderNumber;
    }

    @Column(name = "STORE_NUMBER")
    private long storeNumber;

    @Column(name = "ORDER_NUMBER")
    private long orderNumber;

    /**
     * @return the storeNumber
     */
    public long getStoreNumber() {
        return storeNumber;
    }

    /**
     * @param storeNumber the storeNumber to set
     */
    public void setStoreNumber(long storeNumber) {
        this.storeNumber = storeNumber;
    }

    /**
     * @return the orderNumber
     */
    public long getOrderNumber() {
        return orderNumber;
    }

    /**
     * @param orderNumber the orderNumber to set
     */
    public void setOrderNumber(long orderNumber) {
        this.orderNumber = orderNumber;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (int) (orderNumber ^ (orderNumber >>> 32));
        result = prime * result + (int) (storeNumber ^ (storeNumber >>> 32));
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (!(obj instanceof TendersPK))
            return false;
        TendersPK other = (TendersPK) obj;
        if (orderNumber != other.orderNumber)
            return false;
        if (storeNumber != other.storeNumber)
            return false;
        return true;
    }

    @Override
    public String toString() {
        return "TendersPK [storeNumber=" + storeNumber + ", orderNumber=" + orderNumber + "]";
    }

}

存储库类

import java.util.List;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.hyb.enterprisedashboard.api.entity.Tenders;
import com.hyb.enterprisedashboard.api.entity.TendersPK;

@Repository
public interface DashboardRepository extends JpaRepository<Tenders, TendersPK>{

    @Query("select t from Tenders t where t.mediaType = ?1")
    List<Tenders> findByMediaType(String mediaType);
}

我看到控制台中传递了以下查询

Hibernate: select tenders0_.order_number as order_number1_0_, tenders0_.store_number as store_number2_0_, tenders0_.date_time as date_time3_0_, tenders0_.media_type as media_type4_0_, tenders0_.tendered_amount as tendered_amount5_0_, tenders0_.tendered_media as tendered_media6_0_ from tenders tenders0_

有人可以帮忙找出原因吗?

标签: springspring-bootspring-mvcspring-data-jpaspring-data

解决方案


这发生在我身上,结果我的 spring.datasource.* 属性没有被设置。我将它们放在错误的文件中,并且没有被读取。

如果我没有提供数据源 url、用户名和密码,我会认为我的存储库查询会出错——相反,我只会返回一个空列表。

我最终发现我没有通过在我的 RestController 中添加这个来提取我的数据源凭据:

@Value("${spring.datasource.username}")
String username;

然后我只是将用户名打印到 system.out.println。启动应用程序时,我会收到一个错误,即 spring.datasource.username 未定义。因此,我知道我没有加载我认为的数据源信息。


推荐阅读