java - MySQL 将或不会返回重复行,具体取决于特定列是否存在。为什么?

标签 java mysql spring-boot

我正在使用 Spring Tool Suite 版本:3.9.8.RELEASE 使用扩展 CRUD 的存储库 MySQL表导入CSV文件。

我最初遇到的问题是,由于某种原因,从数据库获取数据时,“名称”列下的值重复,并且许多值丢失。

经过大量测试后,我意识到“名称”下的值被重复(意味着多个值将具有相同的名称),但它们也替换了数据库中的其他“名称”值(丢失的值)。

我去掉了“间隔”列,它解决了问题,这意味着所有值都已返回,没有一个丢失,并且没有重复。我认为发生的情况是,MySQL 以某种方式遵循“间隔”列中的内容,因为某些间隔是重复的(例如 10:00-10:30 可能会出现多次,但与不同的名称值相关)

我的问题是为什么会发生这种情况?是因为“间隔”列的格式吗? (它是 varchar(255) 但写为“00:00-00:00”

@Controller
public class Patterns {

        @Autowired
        private PatternRepository repo;


        @RequestMapping("")
        public String index() {
            return "index";
        }

        @RequestMapping("searchAll")
        public ModelAndView patterns() {

            ModelAndView mv = new ModelAndView("showinfo");


             ArrayList<Pattern> pattern =   (ArrayList<Pattern>) repo.findAll(); 



            mv.addObject("pattern", pattern);


            return mv;
        }


@Entity
public class Pattern {


    @Id
    @GeneratedValue

    public String Intervals;

    public String Name;

    public String Code;

    public String Duration;

    public Long Id;



<h1>show info</h1>
    <fieldset>
        <legend>All Agent Activity</legend>
            <table border="1" cellpadding="5">
                <tr>
                    <th>Intervals</th>
                    <th>Name</th>
                    <th>Code</th>
                    <th>Duration</th>
                </tr>
                <c:forEach items="${pattern}" var = "i" >

                    <tr>
                        <td>${ i.intervals }</td>
                        <td>${ i.name }</td>
                        <td>${ i.code }</td>
                        <td>${ i.duration }</td>
                    </tr>

                </c:forEach>
            </table>
    </fieldset>

MySQL Table

最佳答案

你写道:

  @Entity
  public class Pattern {


      @Id
      @GeneratedValue

      public String Intervals;

      public String Name;

这意味着主键是“Intervals”,而不是名称。因此,对“Name”属性没有特别的限制(至少在java代码中),因此可能会出现重复。

如果您希望“Name”为主键,请将@Id移到Name声明之前的行上。 但是您有一个名为 Id 的属性,您可能认为它是主键。为了使事情变得更简单,您可能还希望自动生成此属性,请将 @Id@GenerateValue 移动到 Id 声明之前

示例:

  @Entity
  public class Pattern {

      public String intervals;

      public String name;

      @Id
      @GeneratedValue
      public Long id;

PS:请使用java命名约定:属性采用驼峰式大小写:第一个字符小写(name,而不是Name)

关于java - MySQL 将或不会返回重复行,具体取决于特定列是否存在。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56563176/

相关文章:

java - 在 RecyclerView 中访问同一行中的所有元素

mysql - 如何在执行 sql 脚本时回显打印语句

java - 将Java连接到MySQL数据库

c# - 我在 Mysql 中遇到希伯来语问题。我与 Visualstudio10、连接器和 linq 一起使用。我能做些什么?

java - 具有相同值的字符串文字不会在 Controller 中保留同步锁

java - 如何在 android 中为 google api 交换 OAuth2 token 的授权码?

java - org.slf4j.helpers.NOPLogger 无法转换为 java.util.logging.Logger

java - 在 Eclipse Luna 中配置 jboss-eap-6.4 服务器时分配正确的主目录时出错

spring - 如何在Spring Cloud Gateway中获取请求体并添加Header

java - Spring post Rest无法解析对象中的对象