Jpa 查询:参数中的属性名称
通过此查询,我成功地在数据库中检索到电话号码:Jpa 查询:参数中的属性名称,jpa,annotations,spring-data,Jpa,Annotations,Spring Data,通过此查询,我成功地在数据库中检索到电话号码: import java.util.List; import org.springframework.data.jpa.repository.JpaReposit ory; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import com.mc.appcontacts.dom
import java.util.List;
import org.springframework.data.jpa.repository.JpaReposit ory;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import com.mc.appcontacts.domain.hibernate.Contact;
public interface ContactRepository extends JpaRepository<Contact, Integer> {
@Query("SELECT c.phoneNumber from Contact c WHERE LOWER(c.name) = LOWER(:name)")
String find(@Param("name") String name);
import java.util.List;
导入org.springframework.data.jpa.repository.jparepository;
导入org.springframework.data.jpa.repository.Query;
导入org.springframework.data.repository.query.Param;
导入com.mc.appcontacts.domain.hibernate.Contact;
公共接口ContactRepository扩展了JpaRepository{
@查询(“从联系人c中选择c.phoneNumber,其中LOWER(c.name)=LOWER(:name)”)
字符串查找(@Param(“name”)字符串名称);
但是否可以在参数中动态指定要检索的属性的名称
在我在网上读到的所有图图中,我了解到我们可以在参数中传递属性的值(在我的示例中:@Param(“name”)String name)
但我想传入参数的是属性的名称,而不是值
我知道下面的例子是不正确的,但它给出了总体思路:
@查询(“从联系人c中选择c.(属性),其中较低的(c.name)=较低的(:name)”)
字符串查找(@Param(“name”)字符串名称,@Param(“property”)字符串属性)
With property=phoneNumber(或我的表的其他属性)
谢谢你的帮助
我不知道怎么做(对我来说一切都是新的): 我读过(并尝试过)jpql的定义如下:
import com.mysema.query.jpa.impl.JPAQuery;
import com.mc.appcontacts.repository.ContactRepository; // managed by spring data
//jpa repository
public class ServicesC {
@Autowired
private ContactRepository repository;
@PersistenceContext // try
private EntityManager em; // try
JPAQuery query = new JPAQuery(em); // try
public Contact getOne(Integer id) {
return repository.findOne(id);
}
public String findAtt(String att, String key){
String jpql = "SELECT c." + att + " from Contact c WHERE LOWER(c.name) = LOWER(:key)"; // try
List<Contact> l = (List<Contact>) em.createQuery(jpql); // try
return "test";
}
}
import com.mysema.query.jpa.impl.JPAQuery;
导入com.mc.appcontacts.repository.ContactRepository;//由spring数据管理
//jpa存储库
公共类服务{
@自动连线
私有存储库;
@PersistenceContext//try
私有实体管理器em;//请重试
JPAQuery query=newjpaquery(em);//试试看
公共联系人getOne(整数id){
返回repository.findOne(id);
}
公共字符串findAtt(字符串att,字符串键){
String jpql=“从联系人c中选择c.”+att+”,其中LOWER(c.name)=LOWER(:key)”;//尝试
List l=(List)em.createQuery(jpql);//试试看
返回“测试”;
}
}
但它不起作用(我并不惊讶……):
2014-02-24 18:18:34.567:警告::嵌套在org.springframework.beans.factory.BeanCreationException中:创建名为“appMapping”的bean时出错:自动关联依赖项注入失败;嵌套异常为org.springframework.beans.factory.BeanCreationException:无法自动关联字段:private com.mc.appcontacts.service.ServiceC.mc.appcontacts.mvc.MappingService.service;嵌套异常为org.springframework.beans.factory.BeanCreationException:创建名为“service”的bean时出错,该名称在文件[C:\Professional\workspace\Eclipse\ContactMain\ContactCore\target\classes\com\mc\appcontacts\service\ServiceC.class]中定义:bean实例化失败;嵌套异常为org.springframework.beans.BeanInstantiationException:无法实例化bean类[com.mc.appcontacts.service.ServiceC]:构造函数引发异常;嵌套异常为java.lang.NullPointerException:
java.lang.NullPointerException
位于com.mysema.query.jpa.impl.JPAProvider.get(JPAProvider.java:72)
位于com.mysema.query.jpa.impl.JPAProvider.getTemplates(JPAProvider.java:80)
请访问com.mysema.query.jpa.impl.JPAQuery。(JPAQuery.java:46)
我必须只为jpql定义第二个EntityManager吗?(可能吗?这是正确的方法吗?我不这么认为…)
我已经在xml文件中为Spring数据定义了EntityManager:
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Activate Spring Data JPA repository support -->
<jpa:repositories base-package="com.mc.appcontacts.repository" />
<!-- Declare a JPA entityManagerFactory -->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="persistenceXmlLocation" value="classpath:META-INF/contacts/hibernate/persistence.xml" />
<property name="persistenceUnitName" value="hibernatePersistenceUnit" />
<!-- <property name="dataSource" ref="dataSource" /> -->
<property name="jpaVendorAdapter" ref="hibernateVendor" />
</bean>
<!-- Specify our ORM vendor -->
<bean id="hibernateVendor" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="showSql" value="${hibernate.showSql}" />
</bean>
<!-- Declare a transaction manager-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
请帮助我…它是如何工作的?不,这是不可能的。您必须通过动态生成JPQL查询来自己实现它 使用查询参数不是一个选项,因为查询参数只能是给定的准备语句中要替换的值,并且不能改变查询本身的性质
String jpql = "select c." + property + " from ...";
我认为对于这个动态构建查询的用例,您最好的选择是探索Criteria API,它非常适合这种情况。Edit选项不起作用,所以我添加:Hello all!!;-)请注意以上内容,以避免SQL注入
String jpql = "select c." + property + " from ...";