Ошибка: > Caused by: java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager:
Exception Description: Problem compiling [select e from User e where e.username = :username].
[14, 18] The abstract schema type ‘User’ is unknown.
[27, 37] The state field path ‘e.username’ cannot be resolved to a valid type.
at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1755) ~[org.eclipse.persistence.jpa-2.7.9-6-jmix.jar:na]
at io.jmix.eclipselink.impl.JmixEclipseLinkQuery.buildJPAQuery(JmixEclipseLinkQuery.java:557) ~[jmix-eclipselink-1.4.4.jar:na]
at io.jmix.eclipselink.impl.JmixEclipseLinkQuery.getQuery(JmixEclipseLinkQuery.java:467) ~[jmix-eclipselink-1.4.4.jar:na]
at io.jmix.eclipselink.impl.JmixEclipseLinkQuery.getResultList(JmixEclipseLinkQuery.java:134) ~[jmix-eclipselink-1.4.4.jar:na]
at io.jmix.eclipselink.impl.JpaDataStore.executeQuery(JpaDataStore.java:576) ~[jmix-eclipselink-1.4.4.jar:na]
at io.jmix.eclipselink.impl.JpaDataStore.loadAll(JpaDataStore.java:167) ~[jmix-eclipselink-1.4.4.jar:na]
at io.jmix.core.datastore.AbstractDataStore.loadList(AbstractDataStore.java:127) ~[jmix-core-1.4.4.jar:na]
at io.jmix.core.impl.UnconstrainedDataManagerImpl.loadList(UnconstrainedDataManagerImpl.java:112) ~[jmix-core-1.4.4.jar:na]
at io.jmix.core.FluentLoader$ByQuery.list(FluentLoader.java:570) ~[jmix-core-1.4.4.jar:na]
at io.jmix.securitydata.user.AbstractDatabaseUserRepository.loadUserByUsername(AbstractDatabaseUserRepository.java:189) ~[jmix-security-data-1.4.4.jar:na]
at org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:94) ~[spring-security-core-5.7.6.jar:5.7.6]
… 103 common frames omitted
скрин jmix приложения при попытке войти в аккаунт:
код сущности User:
@JmixEntity
@Entity
@Table(name = "USER_", indexes = {
@Index(name = "IDX_USER__ON_USERNAME", columnList = "USERNAME", unique = true)
})
@Getter
@Setter
public class User implements JmixUserDetails, HasTimeZone {
@Id
@Column(name = "ID")
@JmixGeneratedValue
private UUID id;
@Version
@Column(name = "VERSION", nullable = false)
private Integer version;
@Column(name = "USERNAME", nullable = false)
protected String username;
@Secret
@SystemLevel
@Column(name = "PASSWORD", nullable = false)
protected String password;
@Column(name = "FIRST_NAME", nullable = false)
protected String firstName;
@Column(name = "LAST_NAME", nullable = false)
protected String lastName;
@Column(name = "POSITION_", nullable = false)
private String position;
@Column(name = "PHONE", nullable = false)
private String phone;
@Email
@Column(name = "EMAIL", nullable = false)
protected String email;
@Column(name = "ACTIVE", nullable = false)
protected Boolean active = true;
@Column(name = "TIME_ZONE_ID")
protected String timeZoneId;
@Column(name = "TYPE_", nullable = false)
private String type;
public UserType getType() {
return UserType.fromId(type);
}
public void setType(UserType type) {
this.type = type.getId();
}
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "ORGANIZATION_ID", nullable = false)
private Organization organization;
@JoinTable(
name = "USER_BRANCH_LINK",
joinColumns = @JoinColumn(name = "USER_ID"),
inverseJoinColumns = @JoinColumn(name = "BRANCH_ID")
)
@ManyToMany
private List<Branch> branches;
@Transient
protected Collection<? extends GrantedAuthority> authorities;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return authorities != null ? authorities : Collections.emptyList();
}
@DeletedBy
@Column(name = "DELETED_BY")
private String deletedBy;
@DeletedDate
@Column(name = "DELETED_DATE")
@Temporal(TemporalType.TIMESTAMP)
private Date deletedDate;
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return Boolean.TRUE.equals(active);
}
@InstanceName
@DependsOnProperties({"firstName", "lastName", "username"})
public String getDisplayName() {
return String.format("%s %s", (firstName != null ? firstName : ""),
(lastName != null ? lastName : "")).trim();
}
public static class Properties {
public static String FIRSTNAME = "firstName";
public static String LASTNAME = "lastName";
public static String TYPE = "type";
public static String USERNAME = "username";
}
}