我有一个不是主键ID的字段。如何通过该非主键使用JPA存储库获取数据?

时间:2019-04-26 07:23:31

标签: spring-boot spring-data-jpa

我有一个模特用户。有一个字段是contact,它是一个非主键。如何使用此密钥获取数据?这是唯一的密钥。

这是我的模特。

@Entity
@Table(name = "tbl_user")
public class User {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "user_id")
long userId;

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

@Column(name = "email")
String email;

@Column(name = "contact")
String contact;

@Column(name = "category")
String category;

public long getUserId() {
    return userId;
}

public void setUserId(long userId) {
    this.userId = userId;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getContact() {
    return contact;
}

public void setContact(String contact) {
    this.contact = contact;
}

public String getCategory() {
    return category;
}

public void setCategory(String category) {
    this.category = category;
}

public User() {
}

}

这是Service层中的方法。

public User getUserByContact(String contact) {
        Optional<User> result = userRepository.findByContact(contact);
        User user = result.get();
        return user;
    }

这是存储库。

@Repository
public interface UserRepository extends JpaRepository<User, Long> {

    @Query("select u from User u where u.contact = ?1")
    User findByContact(String contact);
}

我在“用户”下的此部分出现“从用户u中选择u,其中u.contact =?1”时出错,并说“不能解析符号用户”。不胜感激。

2 个答案:

答案 0 :(得分:0)

省略@Query部分,如果扩展JpaRepository,则不需要该部分。 As stated in the documentation JPA从方法名称派生查询。
我不确定这是否是一个问题,但是在您的实体类中,您使用long作为id,在存储库定义(JpaRepository<User, Long>)中,您使用了Long。如果这没问题,请纠正我。

答案 1 :(得分:0)

如果你想使用@Query,那么正确的做法是使用@Param来定义变量

@Query("select u from User u where u.contact = :contactVar ", nativeQuery = true) 用户 findByContact(@Param("contactVar")String contactVar);