Java 如何与JPA容器一起使用AND或or?
我正在寻找如何使用子句和或在我的应用程序中进行登录。对于SQL,我使用“SELECT*FROM person WHERE email=?和password=?”,但是对于JPA容器,我不知道如何做到这一点Java 如何与JPA容器一起使用AND或or?,java,jpa,vaadin,vaadin7,Java,Jpa,Vaadin,Vaadin7,我正在寻找如何使用子句和或在我的应用程序中进行登录。对于SQL,我使用“SELECT*FROM person WHERE email=?和password=?”,但是对于JPA容器,我不知道如何做到这一点 //Beans @Entity public class Person { @Id @GeneratedValue private Integer id; @NotNull @Size(min=5, max=50) privat
//Beans
@Entity
public class Person {
@Id
@GeneratedValue
private Integer id;
@NotNull
@Size(min=5, max=50)
private String name;
@Email
private Email email;
@Size(min=8,max=8)
private String password;
@ManyToOne
private PersonType personType;
}
@Entity
public class PersonType {
@Id
@GeneratedValue
private Integer id;
@NotNull
@Size(min=5, max=50)
private String personType;
}
如何使用JPA容器检查人员的电子邮件和密码并返回列表?如果我理解正确,您希望通过检查
电子邮件和密码字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):
不过,我要重复一次,使用普通的CriteriaQuery可能更合适
此外,请不要掉以轻心,从您的个人
实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且
如果数据库受损,可能会使您的用户面临风险,并且
如果您的代码经过审核/审查,可能会严重打击您自己的声誉
编辑:
使用CriteriaQuery,您可以执行以下操作:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> q = qb.createQuery(Long.class);
Root<Person> root = q.from(Person.class);
Path<String> email = root.get("email");
Path<String> password = root.get("password");
cq.select(cb.count(root)).where(
cb.and(
cb.equal(email, emailInput),
cb.equal(password, passwordInput)
)
);
return entityManager.createQuery(cq).getSingleResult();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery q=qb.createQuery(Long.class);
Root=q.from(Person.class);
路径email=root.get(“email”);
路径密码=root.get(“密码”);
cq.选择(cb.计数(根))。其中(
cb.和(
cb.equal(电子邮件、电子邮件输入),
cb.equal(密码、密码输入)
)
);
返回entityManager.createQuery(cq.getSingleResult();
如果您愿意,将cb.和(…)
替换为cb.或(…)
。HTH.如果我理解正确,您希望通过检查电子邮件
和密码
字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):
不过,我要重复一次,使用普通的CriteriaQuery可能更合适
此外,请不要掉以轻心,从您的个人
实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且
如果数据库受损,可能会使您的用户面临风险,并且
如果您的代码经过审核/审查,可能会严重打击您自己的声誉
编辑:
使用CriteriaQuery,您可以执行以下操作:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> q = qb.createQuery(Long.class);
Root<Person> root = q.from(Person.class);
Path<String> email = root.get("email");
Path<String> password = root.get("password");
cq.select(cb.count(root)).where(
cb.and(
cb.equal(email, emailInput),
cb.equal(password, passwordInput)
)
);
return entityManager.createQuery(cq).getSingleResult();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery q=qb.createQuery(Long.class);
Root=q.from(Person.class);
路径email=root.get(“email”);
路径密码=root.get(“密码”);
cq.选择(cb.计数(根))。其中(
cb.和(
cb.equal(电子邮件、电子邮件输入),
cb.equal(密码、密码输入)
)
);
返回entityManager.createQuery(cq.getSingleResult();
如果您愿意,将cb.和(…)
替换为cb.或(…)
。HTH.如果我理解正确,您希望通过检查电子邮件
和密码
字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):
不过,我要重复一次,使用普通的CriteriaQuery可能更合适
此外,请不要掉以轻心,从您的个人
实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且
如果数据库受损,可能会使您的用户面临风险,并且
如果您的代码经过审核/审查,可能会严重打击您自己的声誉
编辑:
使用CriteriaQuery,您可以执行以下操作:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> q = qb.createQuery(Long.class);
Root<Person> root = q.from(Person.class);
Path<String> email = root.get("email");
Path<String> password = root.get("password");
cq.select(cb.count(root)).where(
cb.and(
cb.equal(email, emailInput),
cb.equal(password, passwordInput)
)
);
return entityManager.createQuery(cq).getSingleResult();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery q=qb.createQuery(Long.class);
Root=q.from(Person.class);
路径email=root.get(“email”);
路径密码=root.get(“密码”);
cq.选择(cb.计数(根))。其中(
cb.和(
cb.equal(电子邮件、电子邮件输入),
cb.equal(密码、密码输入)
)
);
返回entityManager.createQuery(cq.getSingleResult();
如果您愿意,将cb.和(…)
替换为cb.或(…)
。HTH.如果我理解正确,您希望通过检查电子邮件
和密码
字段来验证登录。我不知道你为什么需要一个JPA容器而不是一个简单的标准查询,但下面是你的问题的答案(我不知道):
不过,我要重复一次,使用普通的CriteriaQuery可能更合适
此外,请不要掉以轻心,从您的个人
实体中,我推断您将密码以明文形式存储在数据库中,这是一个很大的禁忌,并且
如果数据库受损,可能会使您的用户面临风险,并且
如果您的代码经过审核/审查,可能会严重打击您自己的声誉
编辑:
使用CriteriaQuery,您可以执行以下操作:
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> q = qb.createQuery(Long.class);
Root<Person> root = q.from(Person.class);
Path<String> email = root.get("email");
Path<String> password = root.get("password");
cq.select(cb.count(root)).where(
cb.and(
cb.equal(email, emailInput),
cb.equal(password, passwordInput)
)
);
return entityManager.createQuery(cq).getSingleResult();
CriteriaBuilder cb=entityManager.getCriteriaBuilder();
CriteriaQuery q=qb.createQuery(Long.class);
Root=q.from(Person.class);
路径email=root.get(“email”);
路径密码=root.get(“密码”);
cq.选择(cb.计数(根))。其中(
cb.和(
cb.equal(电子邮件、电子邮件输入),
cb.equal(密码、密码输入)
)
);
返回entityManager.createQuery(cq.getSingleResult();
如果您愿意,将cb.和(…)
替换为cb.或(…)
。嗯。我设法做到了
是我干的
EntityManager em = datasource.getEntityProvider().getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Person> c = cb.createQuery(Person.class);
Root<Person> person = c.from(Person.class);
c.where(
cb.and(
cb.equal(person.get("email"), email.getValue()),
cb.equal(person.get("password"), password.getValue()))
);
TypedQuery tq = em.createQuery(c);
List<Person> lista = tq.getResultList();
EntityManager em=datasource.getEntityProvider().getEntityManager();
CriteriaBuilder cb=em.getCriteriaBuilder();
CriteriaQuery c=cb.createQuery(Person.class);
根person=c.from(person.class);
c、 在哪里(
cb.和(
cb.equal(person.get(“email”)、email.getValue(),
cb.equal(person.get(“密码”)、password.getValue())
);
TypedQuery tq=em.createQuery(c);