Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 查询:参数中的属性名称_Jpa_Annotations_Spring Data - Fatal编程技术网

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 ...";