【问题标题】:Repository returns empty list in Spring boot存储库在 Spring Boot 中返回空列表
【发布时间】:2020-06-15 19:51:39
【问题描述】:

我正在尝试编写一个简单的 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_

谁能帮忙找出原因?

【问题讨论】:

  • 如果您手动运行查询会发生什么?
  • @DonHosek 如果我只是在 sql developer 中运行确切的查询,它确实会返回结果
  • 我尝试实现 CrudRepository 只是为了测试,但返回了相同的空列表。没有抛出错误,也没有捕获异常。我错过了什么吗?请问有人吗?
  • 在您的@Query("select t from Tenders t where t.mediaType = ?1") 中尝试将Tenders 替换为TENDERS,因为在您的实体中您使用了所有大写字母。否则,尝试使用像这样的原生查询@Query( value = "SELECT t FROM TENDERS t where tMEDIA_TYPE = ?1", nativeQuery = true)
  • 已解决。数据库连接指向同一数据库中的不同模式。谢谢大家的cmets

标签: spring spring-boot spring-mvc spring-data-jpa spring-data


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2021-06-27
    • 2021-09-03
    • 2017-04-23
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多