Как получить определенные строки из второй таблицы с помощью JPA - PullRequest
1 голос
/ 25 мая 2019

У меня есть две таблицы: одна - клиент, а другая - клиентский отдел.У клиента есть отношение один ко многим с customerDepartment.

У меня есть определенное условие поиска, в котором мне нужно найти название отдела, если оно равно, мне нужно получить все строки отдела клиентов, включая клиентов.

Это то, что я пытался получить результаты

public interface CustomerRepository extends JpaRepository<Customer,Integer>{


    @Query(value="select DISTINCT c from Customer c left join c.custDept cd where cd.deptName like %?1% ")
    Page<Customer> findByName(String name, Pageable pageable);

}

Клиент

@Entity
@Table(name="customer")
public class Customer implements Serializable{


    private static final long serialVersionUID = 1L;

    @Id
    @Column(name= "customer_no",updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int customerNo;

    @Column(name= "customer_name")
    private String customerName;

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

     @JsonManagedReference
     @OneToMany(mappedBy = "customer", cascade = CascadeType.ALL, 
     fetch=FetchType.LAZY)
     private Set<CustomerDepartment> custDept;

}

CustomerDepartment:

@Entity
@Table(name = "customer_department")
public class CustomerDepartment implements Serializable{

    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "dept_id",updatable = false, nullable = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    private int depId;

    @Column(name = "dept_name")
    private String deptName;

    @Column(name = "primary_contact")
    private String primaryContact;

      @JsonBackReference
      @ManyToOne(fetch=FetchType.LAZY)
      @JoinColumn(name = "customer_no", nullable = false)
      private Customer customer;

}

Когда я искал DepartmentName =это, приведенный выше JPA-запрос, возвращающий приведенные ниже результаты

{
    "content": [
        {
            "customerNo": 33,
            "customerName": "Test1",
            "industry": "High-Tech",
            "country": "Australia",
            "state": "Sa-Jose",
            "city": "Sydney",
            "custDept": [
                {
                    "depId": 34,
                    "deptName": "It",
                    "primaryContact": "Banglore,Kormangala",
                },
                {
                    "depId": 35,
                    "deptName": "sales",
                    "primaryContact": "Banglore,Kormangala",

                }
            ]
        }
    ]
}   

То, на что я рассчитываю, больше похоже.

{
    "content": [
        {
            "customerNo": 33,
            "customerName": "Test1",
            "industry": "High-Tech",
            "country": "Australia",
            "state": "Sa-Jose",
            "city": "Sydney",
            "custDept": [
                {
                    "depId": 34,
                    "deptName": "It",
                    "primaryContact": "Banglore,Kormangala",
                }
            ]
        }
    ]
}   

Если это невозможно в JPA, есть ли способ, которым я могусделай это.Спасибо за помощь

1 Ответ

0 голосов
/ 26 мая 2019

Да, я так и думал.Я прокомментировал, что «я думаю, что ваш запрос в порядке, но когда результат маршалируется в JSON, тогда извлекаются все связанные отделы. Вы должны посмотреть свой вывод sql, отладить и проверить результаты запроса, прежде чем маршалинг, чтобы убедиться, что это так.дело ".Я пошел вперед и поиграл с этим, и я был более или менее прав.

Проблема заключается в том, что вы не получили набор custDept с вашим запросом, поэтому, когда заказчик запрашивает ваш ответ об отдыхе, выполняется дополнительный запрос для получения значений, а дополнительный запрос просто запрашивает все.

2019-05-25 14: 29: 35.566 DEBUG 63900 --- [nio-8080-exec-2] org.hibernate.SQL: выберите отдельный customer0_.customer_no как customer1_0_,customer0_.customer_name в качестве customer2_0_, customer0_.industry в качестве Industry3_0_ от клиента customer0_ оставил внешнее присоединение customer_department custdept1_ на customer0_.customer_no = custdept1_.customer_no, где custdept1_.dept_name нравится?предел?

2019-05-25 14: 29: 35.653 DEBUG 63900 --- [nio-8080-exec-2] org.hibernate.SQL: выберите custdept0_.customer_no в качестве customer4_1_0_, custdept0_.dept_id в качестве dept_id1_1_0_, custdept0_.dept_id в качестве dept_id1_1_1_, custdept0_.customer_no в качестве customer4_1_1_, custdept0_.dept_name в качестве dept_nam2_1_1_, custdept0_.primary_contact как первичный_3_1_1 * * * * * 10100_0_0_0_0_0_0_0 =>Ваш запрос предоставляет вам выборку, поэтому custDept набор инициализируется перед маршалингом.Есть и другие проблемы с вашим запросом.Вы должны использовать параметр sql :deptName, и вы должны объявить это, и вы должны предоставить countQuery, так как вы возвращаете Page.

public interface CustomerRepository extends JpaRepository<Customer,Integer>{
    @Query(value="select DISTINCT c from Customer c left join fetch c.custDept cd where cd.deptName like %:deptName% ", 
            countQuery = "select count ( DISTINCT c ) from Customer c left join c.custDept cd where cd.deptName like %:deptName% ")
    public Page<Customer> findByName(@Param("deptName") String deptName, Pageable pageable);

Работало для меня.Теперь выполняется только исходный запрос, и результат верен.

{
"content": [
    {
        "customerNo": 1,
        "custDept": [
            {
                "deptName": "it"
            }
        ]
    }
],

Наконец, обратите внимание, что лучше использовать Integer для @Id в ваших сущностях согласно документации Spring.

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