Ошибка оператора объединения таблиц Spring Data JPA не существует - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть две таблицы, Projects и TransitionAction. И Projects, и TransitionAction имеют столбец request_no, который используется для выполнения соединения между ними. Классы сущностей указаны ниже: -

Project.java

@Entity
public class Project implements Serializable {
private static final long serialVersionUID = 1L;
@Id 
@SequenceGenerator(schema = "public", name="project_id_seq_gen",sequenceName="project_id_seq",initialValue=1,allocationSize=1)
@GeneratedValue(strategy= GenerationType.SEQUENCE,generator="project_id_seq_gen")   
private Integer id;

@Column(name = "request_no")
private String request_no;
@Column(name = "title")
private String title;
@Column(name = "department")
private String department;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "requestNo")
private Set<TransitionAction> tacts;

@ManyToOne
@JoinColumn(name = "status_id")
private Status status;

@ManyToOne
@JoinColumn(name = "level_id")
private ProjectLevel level;

TransitionAction.java

@Entity
@Table(name = "transitionaction")
public class TransitionAction implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)

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

    @Column(name = "actionDate")
    private Date actionDate;

Код, используемый для получения списка проектов следующим образом: -

public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {

UserInfo findByUserName(String userName);

@Query("SELECT project FROM Project project Join project.tacts pta where project.request_no= pta.request_no and project.status.id=1")
List<Project> getAllUserProjects();
}

Я получаю сообщение об ошибке ResultSet. Когда я проверил консоль, я обнаружил, что генерируется следующий запрос:

select
        distinct project0_.id as id1_1_,
        project0_.department as departme2_1_,
        project0_.level_id as level_id6_1_,
        project0_.user_nodal_officer as user_nod3_1_,
        project0_.request_no as request_4_1_,
        project0_.status_id as status_i7_1_,
        project0_.title as title5_1_ 
    from
        project project0_ 
    inner join
        transitionaction tacts1_ 
            on project0_.id=tacts1_.request_no

Я не понимаю, почему проект. Идентификатор соединяется с tact.request_no и создает ошибку

Оператор не существует: целое число = символ меняется

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Итак, вы хотите, чтобы все TransitionAction были связаны с Project по запросуNo

Вы можете достичь этого, добавление @ManyToOne отображение в TransactionAction как это

@ManyToOne(fetch = FetchType.LAZY)
private Project project;

Теперь вам нужно изменить ваш запрос следующим образом

@Query("SELECT project FROM Project project where project.status.id=1")
List<Project> getAllUserProjects();

Чтобы получить все TransactionAction для данного проекта

Set<TransitionAction> allTatcts =  project.getTacts();

Вам не нужно добавлять соединение в запрос. Hibernate позаботится об этом, как только вы извлечете TransactionAction из Project от объекта.

Редактировать 1:

Но почему мой запрос не прошел? Почему первичный ключ проекта соединился с request_no для TransitionAction?

Ваш запрос не выполнен, так как при выполнении отношения @OneTOMany yodid не определено @JoinColumn or @JoinTable, что является однонаправленным отображением.

В этом случае Hibernate будет использовать столбец primarykey для сопоставления.

А так как тип первичного ключа и столбца различен, то ошибка.

Без описания какого-либо физического отображения (без @JoinColumn или @JoinTable), используется однонаправленная связь с таблицей соединений. имя таблицы - это объединение имени таблицы владельца, _ и имя другой боковой таблицы. Имена внешних ключей, ссылающиеся на владельца таблица - это конкатенация таблицы владельца, _ и владельца имя столбца первичного ключа. Имена внешних ключей, ссылающиеся на другая сторона - это конкатенация имени свойства владельца, _, и имя столбца (ов) первичного ключа другой стороны. Уникальное ограничение добавляется к внешний ключ, ссылающийся на другую таблицу сторон, чтобы отразить много.

Подробнее см. Официальный документ

@OneToMany
@JoinTable(
        name="table_name",
        joinColumns = @JoinColumn( name="columnname")
)
private Set<TransitionAction> tacts;
0 голосов
/ 05 ноября 2018

Это потому, что у вас есть @Id для request_no в вашем классе TransactionAction, и когда вы присоединяетесь к двум классам, они присоединяются к первичным ключам.

Вместо этого вы можете использовать перекрестное соединение.

SELECT project FROM Project project, TransactionAction pta where project.request_no= pta.request_no and project.status.id=1

Или вы можете иметь двунаправленное отображение. Добавьте следующее в свой класс сущности TransactionAction.

@ManyToOne
private Project Project;

И тогда ваш запрос будет следующим.

select pta.project from TransactionAction pta where pta.request_no=pta.project.request_no and pta.project.status.id=1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...