我正在寻找如何使用子句AND或OR在我的应用程序中进行登录。使用SQL我使用“SELECT * FROM person WHERE email =?AND password =?”,但是使用JPAContainer我不知道该怎么做。
//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;
}
如何查看人员的电子邮件和密码并使用JPAContainer返回列表?
答案 0 :(得分:3)
如果我理解正确,您可以通过同时检查email
和password
字段来验证登录信息。我不确定为什么你需要一个JPAContainer而不是一个简单的CriteriaQuery,但这里是你的问题的答案(在我的头顶):
JPAContainer<Person> container =
JPAContainerFactory.<Person>makeReadOnly(Person.class, entityManager);
container.addContainerFilter(new Compare.Equal("email", emailInput));
container.addContainerFilter(new Compare.Equal("password", passwordInput));
// Query container size, eg
if(container.size()==1) { ... }
如果以这种方式添加多个容器过滤器,它们将被隐含地理解为其交集,即。 AND。
如果你想要过滤器的联合,即。或者,您必须自己构建它(如果有任何意义由您自行决定):
Filter filter = new Compare.OR(new Compare.Equal("email", emailInput), new Compare.Equal("password", passwordInput));
container.addContainerFilter(filter);
但是,我将重复使用一个简单的CriteriaQuery可能更合适。
此外 - 并且不要轻视你的Person
实体,我推断你在数据库中清楚地存储了密码,这是一个很大的禁忌,并且< / p>
修改强>:
使用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();
如果您愿意,请将cb.and(...)
替换为cb.or(...)
。 HTH。
答案 1 :(得分:0)
我设法做到了。
我做到了。
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();
现在有效!