MySQL будет или не будет возвращать повторяющиеся строки, в зависимости от того, присутствует конкретный столбец или нет.Зачем? - PullRequest
0 голосов
/ 12 июня 2019

Я использую 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

1 Ответ

1 голос
/ 12 июня 2019

Вы писали:

  @Entity
  public class Pattern {


      @Id
      @GeneratedValue

      public String Intervals;

      public String Name;

Это означает, что первичным ключом является "Интервалы", а не имя.Следовательно, нет никаких особых ограничений на атрибут «Имя» (по крайней мере, в коде Java), поэтому возможны дубликаты.

Если вы хотите, чтобы «Имя» было первичным ключом, переместите @Idна линии прямо перед объявлением Name.Но у вас есть атрибут с именем Id, и вы, вероятно, первичный ключ.Чтобы упростить задачу, вы также, вероятно, хотите, чтобы этот атрибут был сгенерирован автоматически, передвиньте @Id и @GeneratedValue прямо перед объявлением Id

Пример:

  @Entity
  public class Pattern {

      public String intervals;

      public String name;

      @Id
      @GeneratedValue
      public Long id;

PS: Пожалуйста, используйте соглашение об именах Java: атрибуты в случае верблюда: первый символ в нижнем регистре (name, а не Name)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...